【问题标题】:Why are results different when a logarithmic function is applied on same regular matrix and Sparse Matrix?当对数函数应用于相同的正则矩阵和稀疏矩阵时,为什么结果会不同?
【发布时间】:2017-01-08 02:08:57
【问题描述】:

当我尝试在相同的常规和稀疏矩阵上应用log 函数时,得到的结果是不同的。在应用这些功能时我应该记住什么?下面是一个可重现的例子。

TestMatrix = matrix(c(3,1,0,0,0,4,0,1,0,0,2,1,1,2,0,6,1,0,1,0,1,0,0,0,0),5,byrow = TRUE)
TestSparseMatrix = Matrix(TestMatrix,sparse = TRUE)
# Logarithmic function when applied to regular matrix
 -log(TestMatrix / rowSums(TestMatrix), 2)


#Output
#          [,1]     [,2]     [,3]     [,4] [,5]
#[1,] 0.4150375 2.000000      Inf      Inf  Inf
#[2,] 0.3219281      Inf 2.321928      Inf  Inf
#[3,] 1.5849625 2.584963 2.584963 1.584963  Inf
#[4,] 0.4150375 3.000000      Inf 3.000000  Inf
#[5,] 0.0000000      Inf      Inf      Inf  Inf


# Logarithmic function when applied to Sparse matrix
-log(TestSparseMatrix / rowSums(TestSparseMatrix), 2)


# Output
#          [,1]     [,2]     [,3]     [,4] [,5]
#[1,] 0.2876821 1.386294      Inf      Inf  Inf
#[2,] 0.2231436      Inf 1.609438      Inf  Inf
#[3,] 1.0986123 1.791759 1.791759 1.098612  Inf
#[4,] 0.2876821 2.079442      Inf 2.079442  Inf
#[5,] 0.0000000      Inf      Inf      Inf  Inf

【问题讨论】:

    标签: r matrix sparse-matrix


    【解决方案1】:

    log() 忽略 base 的稀疏矩阵(“S4”对象)。使用log2 可以消除问题:

    -log2(TestSparseMatrix / rowSums(TestSparseMatrix))
    

    阅读?log 的“S4 方法”部分。我相信这并不为人所知。

    Note that this means that the S4 generic for ‘log’ has a signature
    with only one argument, ‘x’, but that ‘base’ can be passed to
    methods (but will not be used for method selection).  On the other
    hand, if you only set a method for the ‘Math’ group generic then
    ‘base’ argument of ‘log’ will be ignored for your class.
    

    如果您想知道,可以继续阅读:

    ?groupGeneric
    ?S4groupGeneric
    

    或等效(因为您将被重定向到上述手册页):

    ?base::Math
    ?methods::Math
    

    这确实与“数学”组的定义方式有关。特别引用?S4groupGeneric

    Note that two members of the ‘Math’ group, ‘log’ and ‘trunc’, have
    ... as an extra formal argument.  Since methods for ‘Math’ will
    have only one formal argument, you must set a specific method for
    these functions in order to call them with the extra argument(s).
    

    如果你想用任意有效的base 取对数,比如base = 3,该怎么办?使用公式:

    log(x, base = 3) = log(x) / log(3)
    

    例如,使用您的TestSparseMatrix,您还可以:

    -log(TestSparseMatrix / rowSums(TestSparseMatrix)) / log(2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多