【问题标题】:Sparse matrixes for matrix-vector product in PageRank computationPageRank 计算中矩阵向量积的稀疏矩阵
【发布时间】:2014-10-25 22:14:48
【问题描述】:

我正在实现一些用于计算 webgraph 的 PageRank 的迭代算法,但我在寻找在内存中存储一​​些矩阵的最佳方法时遇到了一些麻烦。

我有一个Bn x n 矩阵,它表示网络图(B[i,j]=1/outdegree[j],如果有从ji 的弧,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 中的相应条目是否为10

所以我在两个不完全独立的事情上苦苦挣扎:

  1. 我如何在 numpy 中实现相同的“技巧”,因为 e*d.T 只是计算标量积,而我想要一个矩阵。我想这是对广播和切片的一些巧妙使用,但我还是 numpy 的新手,无法弄清楚
  2. 如果我像上面一样简单地定义P(假设我找到了1.的解决方案),我失去了将B存储为稀疏矩阵所获得的内存优势,突然我需要存储n^2浮动。无论如何,我添加到B 的矩阵非常多余(只有两种类型的列),所以必须有比将整个矩阵存储在内存中更好的方法。有什么建议么?请记住,它必须能够轻松计算 P.dot(x),因为 x 是任意向量

【问题讨论】:

  • 如果您可以添加一些代码以适当的形状/类型生成示例输入变量(B、d、e 等),这将有所帮助。

标签: python numpy scipy sparse-matrix


【解决方案1】:

为简单起见,由于带有np.dot 的表达式会很庞大,让 表示矩阵乘法,edx 是向量,即具有形状 (n, 1),并且在表达式中方括号* 是python 的列表乘法。然后,通过关联性

(e∙d.T)∙x = e∙(d.T∙x) = [[d.T∙x] * n]

其中d.T∙x 是一个标量,而

P∙x = B∙x + 1/n * e∙d.T∙x = B∙x + 1/n * [[d.T∙x] * n]

为了能够进行计算,您只能存储向量 d。请注意,d.T∙x(如果使用数组,则等价于 np.dot(d.T, x))是向量乘积,相对于矩阵乘法而言是一种廉价的运算。

【讨论】:

  • 是的,我刚刚想出基本相同的东西,而不是在需要时写P.dot(x),我只是写B.dot(x) + (d.dot(x)*e)/n。这样我解决了问题 2。完全避免了问题 1。
【解决方案2】:

第 1 点的答案是:

numpy.outer

它从v1 (M) 数组和v2 (N) 数组创建一个B (MxN) 矩阵,使得B(i,j) = v1[i]*v2[j]

2. 的答案更复杂。

  1. 如果您不再需要B,您可以简单地将其定义为numpy.empty((n,n)),在问题开头填写,然后B += (1/n)*np.outer(e, d)
  2. 如果n 不是太大,那么稀疏矩阵或标准矩阵可能不会有太大区别
  3. 如果可能,将np.outer(e, d) 视为稀疏矩阵,然后尝试this post 的一些建议

【讨论】:

    猜你喜欢
    • 2017-07-20
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 2014-10-11
    • 2015-12-10
    • 2021-08-28
    相关资源
    最近更新 更多