在稀疏矩阵中高效地进行对数函数运算的方法

6

我有一个大的稀疏矩阵。我想对该稀疏矩阵中的所有元素取 log4

我尝试使用 numpy.log(),但它不能处理矩阵。

我也可以逐行取对数。然后用新行替换旧行。

# Assume A is a sparse matrix (Linked List Format) with float values as data
# It is only for one row

import numpy as np
c = np.log(A.getrow(0)) / numpy.log(4)
A[0, :] = c

这不如我预期的那么快。有没有更快的方式来完成这个任务?

2个回答

10
您可以直接修改data属性:
>>> a = np.array([[5,0,0,0,0,0,0],[0,0,0,0,2,0,0]])
>>> coo = coo_matrix(a)
>>> coo.data
array([5, 2])
>>> coo.data = np.log(coo.data)
>>> coo.data
array([ 1.60943791,  0.69314718])
>>> coo.todense()
matrix([[ 1.60943791,  0.        ,  0.        ,  0.        ,  0.        ,
          0.        ,  0.        ],
        [ 0.        ,  0.        ,  0.        ,  0.        ,  0.69314718,
          0.        ,  0.        ]])

请注意,如果稀疏格式中有重复的元素(在COO格式中有效),则此方法不适用;它将单独处理对数,而且log(a) + log(b) != log(a + b)。您可能希望先转换为CSR或CSC格式(速度较快)以避免此问题。
当然,如果稀疏矩阵是以不同的格式存储,您还需要添加检查。如果您不想在原地修改矩阵,可以像在答案中一样构造一个新的稀疏矩阵,但不需要添加3,因为这在这里完全没有必要。

你的解决方案和我的解决方案有什么不同之处?你只是提出了3不必要的观点,而这个观点已经在我的解决方案中由你作为评论提出过了。 - Baskaya
@Thorn 我最初误读了你的解决方案(认为你正在将3添加到整个矩阵中,因此进行了大量不必要的对数运算)。你是正确的,它们基本上是相同的。 - Danica
非常感谢这个答案,因为它的例子非常清晰明了。 即使它本质上是相同的答案,在这里也很好。 - P i

0

我认为我用非常简单的方法解决了它。很奇怪没有人能够立即回答。

# Let A be a COO_matrix
import numpy as np
from scipy.sparse import coo_matrix
new_data = np.log(A.data+3)/np.log(4) #3 is not so important. It can be 1 too.
A = coo_matrix((new_data, (A.row, A.col)), shape=A.shape)

6
因为数学上的错误,没有人提出这个解决方案。log(x)log(x+1) 可能非常不同!例如:log(0.000001)=-6,log(0.0000001+1) 则是一个接近于 0 的小数。 - Li-aung Yip
抱歉提出了不明确的问题。我没有提到所有数据都是正数且大于1。这些是TF(词项频率)矩阵的值。我认为不会有问题。 - Baskaya
这里绝对没有理由添加3(或任何其他数字),因为A.data中的所有条目都不会是0。但是,如果您确实想采取添加常量的方法,请使用较小的常量!例如,添加1e-16将具有永远不会出现log(0)的相同效果,但引入的误差要少得多:使用适当的恒等式,它是log(x + eps) = log(x) + log(1 + eps/a),其中引入的误差接近于0,如果eps/a几乎为0。 - Danica
@Dougal 谢谢你,但我想要加上 3,因为我不想在对数后将这些 1 变成零。这是术语矩阵的设计问题,与 文本处理 相关。我不想添加非常小的值,因为对我来说,1 比你想象的更重要。此外,它并没有太大的变化。 - Baskaya
@Thorn 我不确定你在对数方面具体在做什么,但如果你正在使用任何使用log的NLP算法,如果你没有真正给它log,那么它将会做错事情。在这种情况下,它可能会过分强调只有1个观察计数的事物。如果问题仅仅是你想区分原始条目是否为1以及不存在时,你可以考虑自己维护一个条目列表,并在想要进行矩阵操作时将它们放入COO稀疏矩阵中。 - Danica
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接