我想写一个函数来规范化一个大型稀疏矩阵的行(这样它们加起来就是一个)。
from pylab import *
import scipy.sparse as sp
def normalize(W):
z = W.sum(0)
z[z < 1e-6] = 1e-6
return W / z[None,:]
w = (rand(10,10)<0.1)*rand(10,10)
w = sp.csr_matrix(w)
w = normalize(w)
但是,这会导致以下异常:
File "/usr/lib/python2.6/dist-packages/scipy/sparse/base.py", line 325, in __div__
return self.__truediv__(other)
File "/usr/lib/python2.6/dist-packages/scipy/sparse/compressed.py", line 230, in __truediv__
raise NotImplementedError
有没有合理简单的解决办法?我已经看了this,但是还不清楚如何实际进行除法。
这已在scikit-learn sklearn.preprocessing.normalize中实现。
axis=1
应按行规格化,axis=0
应按列规格化。使用可选参数copy=False
就地修改矩阵。这是我的解决办法。
转置C
虽然Aarons的回答是正确的,但我实现了一个解决方案,当时我想规范化绝对值的最大值,sklearn没有提供这个值。我的方法使用非零项并在csr_matrix.data数组中找到它们,以便快速替换其中的值。
与sunan的解决方案相反,这种方法不需要将矩阵转换成密集格式(这可能会引起内存问题),也不需要矩阵乘法。我在一个稀疏的形状矩阵(350000486000)上测试了这个方法,花了大约18秒。
相关问题 更多 >
编程相关推荐