Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在稀疏矩阵中求对数函数的有效方法_Python_Matrix_Numpy_Scipy_Sparse Matrix - Fatal编程技术网

Python 在稀疏矩阵中求对数函数的有效方法

Python 在稀疏矩阵中求对数函数的有效方法,python,matrix,numpy,scipy,sparse-matrix,Python,Matrix,Numpy,Scipy,Sparse Matrix,我有一个大的稀疏矩阵。我想对稀疏矩阵中的所有元素取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, :

我有一个大的稀疏矩阵。我想对稀疏矩阵中的所有元素取
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

这并不像我预料的那么快。有没有更快的方法

我想我用一种非常简单的方法解决它。很奇怪,没有人能马上回答

# 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)

您可以直接修改
数据
属性:

>>> 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)!=日志(a+b)
。您可能希望首先转换为CSR或CSC(这很快),以避免此问题


当然,如果稀疏矩阵的格式不同,您还必须添加检查。如果你不想修改矩阵,只需像你在回答中那样构造一个新的稀疏矩阵,但不要添加
3
,因为这在这里是完全不必要的。

没有人提出这个解决方案,因为它在数学上是不正确的<代码>日志(x)可能与
日志(x+1)
非常不同!(例如:
log(0.000001)=-6
log(0.0000001+1=0,还有一点
)。很抱歉这个问题不太合适。我没有提到所有数据都是正数并且大于1。这是TF(术语频率)矩阵的值。我想不会有问题。绝对没有理由添加3(或任何东西)在这里,由于
A.data
中没有一个条目将为0。但是如果您确实想采用添加常数的方法,请使用较小的一个!添加(例如
1e-16
将具有与从不使用
log(0)
相同的效果,但引入的错误要小得多:使用,它是
log(x+eps)=log(x)+log(1+eps/A)
,如果
eps/a
几乎为0,则引入的误差接近于0。@Dougal谢谢你,但我想添加
3
,因为我不想在对数后将这些1设为零。这是术语矩阵的设计问题,与
文本处理相关。我不想添加非常小的值,因为对我来说,1更重要比你想象的要重要。此外,它变化不大。@Thorn我不确定你在这里用对数做什么,但是如果你在做任何使用日志的NLP算法,如果你没有实际给它日志,它将做错误的事情。在这种情况下,它可能只会用1个ob来加重事情的重量服务计数。如果问题只是您想区分原始条目何时有1和何时不存在,您可能需要考虑自己维护条目列表,并在执行矩阵运算时将它们放入COO稀疏矩阵中。我的解决方案和您的解决方案之间有何区别?您是否需要只建议3是不必要的,这已经被你在我的解决方案中作为一个评论提出了。@Thorn我实际上一开始误读了你的解决方案(以为你在整个矩阵中添加3,所以做了很多不必要的logarthms).你说得对,他们基本上是一样的。感谢这个答案,因为这个例子很清楚地说明了这一点。即使基本上是一样的答案,也很高兴有它在这里。