【发布时间】:2014-10-25 22:14:48
【问题描述】:
我正在实现一些用于计算 webgraph 的 PageRank 的迭代算法,但我在寻找在内存中存储一些矩阵的最佳方法时遇到了一些麻烦。
我有一个Bn x n 矩阵,它表示网络图(B[i,j]=1/outdegree[j],如果有从j 到i 的弧,0 否则;outdegree[j] 是从节点j),我将其存储为scipy.sparse.dok_matrix,因为它当然主要有0 条目。问题是我必须计算 Px 类型的许多矩阵 x 向量积,其中
P = B + (1/n)*e*d^T
其中e 是全1 向量,d 是一个布尔向量,如果outdegree[j] > 0,则1 在组件j 中。基本上e*d^T 是一种线性代数“技巧”,可以编写一个n x n 矩阵,其列全部由1s 或0s 组成,具体取决于d 中的相应条目是否为1 或0。
所以我在两个不完全独立的事情上苦苦挣扎:
- 我如何在 numpy 中实现相同的“技巧”,因为
e*d.T只是计算标量积,而我想要一个矩阵。我想这是对广播和切片的一些巧妙使用,但我还是 numpy 的新手,无法弄清楚 - 如果我像上面一样简单地定义
P(假设我找到了1.的解决方案),我失去了将B存储为稀疏矩阵所获得的内存优势,突然我需要存储n^2浮动。无论如何,我添加到B的矩阵非常多余(只有两种类型的列),所以必须有比将整个矩阵存储在内存中更好的方法。有什么建议么?请记住,它必须能够轻松计算P.dot(x),因为x是任意向量
【问题讨论】:
-
如果您可以添加一些代码以适当的形状/类型生成示例输入变量(B、d、e 等),这将有所帮助。
标签: python numpy scipy sparse-matrix