【发布时间】:2011-12-02 15:54:47
【问题描述】:
我需要一种有效的方法来对稀疏矩阵进行行标准化。
给定
W = matrix([[0, 1, 0, 1, 0, 0, 0, 0, 0],
[1, 0, 1, 0, 1, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 1, 0, 0, 0],
[1, 0, 0, 0, 1, 0, 1, 0, 0],
[0, 1, 0, 1, 0, 1, 0, 1, 0],
[0, 0, 1, 0, 1, 0, 0, 0, 1],
[0, 0, 0, 1, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 1, 0, 1, 0, 1],
[0, 0, 0, 0, 0, 1, 0, 1, 0]])
row_sums = W.sum(1)
我需要生产...
W2 = matrix([[0. , 0.5 , 0. , 0.5 , 0. , 0. , 0. , 0. , 0. ],
[0.33, 0. , 0.33, 0. , 0.33, 0. , 0. , 0. , 0. ],
[0. , 0.5 , 0. , 0. , 0. , 0.5 , 0. , 0. , 0. ],
[0.33, 0. , 0. , 0. , 0.33, 0. , 0.33, 0. , 0. ],
[0. , 0.25, 0. , 0.25, 0. , 0.25, 0. , 0.25, 0. ],
[0. , 0. , 0.33, 0. , 0.33, 0. , 0. , 0. , 0.33],
[0. , 0. , 0. , 0.5 , 0. , 0. , 0. , 0.5 , 0. ],
[0. , 0. , 0. , 0. , 0.33, 0. , 0.33, 0. , 0.33],
[0. , 0. , 0. , 0. , 0. , 0.5 , 0. , 0.5 , 0. ]])
在哪里,
for i in range(9):
W2[i] = W[i]/row_sums[i]
我想找到一种不使用循环(即矢量化)并使用 Scipy.sparse 矩阵的方法。 W 可以大到 10mil x 10mil。
【问题讨论】:
-
我刚刚意识到 W 是否密集(一个常规的 numpy 矩阵)。 W2 = W/W.sum(1) 工作正常。但是 scipy 的稀疏矩阵似乎不支持除法。
-
除了在 C 代码中实现这个除法并从 Python 调用之外,我没有看到其他方法。稀疏矩阵的 W.sum 工作正常吗?
-
是的,稀疏上的 W.sum(1) 返回一个行和向量。
-
W2 的值始终为 (1./row_sum)。也许有一种简单的方法可以用列向量中的值替换 W 中的 1?
-
这里有一个使用 sklearn 的简单方法:stackoverflow.com/questions/12305021/…