5

对不起,如果这很愚蠢,但我只是想我应该试一试。假设我有一个巨大的图表(例如,1000 亿个节点)。Neo4J 支持 320 亿,其他支持或多或少相同,所以说我不能同时在数据库中拥有整个数据集,如果它是有向图(无循环)并且每组节点连接,我可以在其上运行 pagerank到下一组节点(因此不会向后创建新链接,只会创建指向新数据集的新链接)。

有没有一种方法可以以某种方式获取以前的 pagerank 分数并将它们应用于新的数据集(我只关心最近一组数据的 pagerank,但需要前一组的 pagerank 来导出最后一组数据)?

那有意义吗?如果可以,有可能吗?

4

1 回答 1

5

您需要计算 1000 亿乘 1000 亿矩阵的主特征向量。除非它非常稀疏,否则您无法将其放入机器中。因此,当您一次只能查看矩阵的一小部分时,您需要一种方法来计算矩阵的前导特征向量。

计算特征向量的迭代方法只需要在每次迭代时存储几个向量(它们每个都有 1000 亿个元素)。这些可能适合您的机器(每个向量需要大约 375GB 的 4 字节浮点数)。一旦你有了一个候选排名向量,你就可以(非常缓慢地)通过读取矩阵的块来应用你的巨型矩阵(因为你一次可以查看 320 亿行,你只需要超过 3 个块)。重复此过程,您将掌握在 pagerank 中使用的 power 方法的基础知识。参见http://www.ams.org/samplings/feature-column/fcarc-pagerankhttp://en.wikipedia.org/wiki/Power_iteration

当然,这里的限制因素是您需要检查矩阵多少次。事实证明,通过存储多个候选向量并使用一些随机算法,您可以通过更少的数据读取获得良好的准确性。这是应用数学界当前的研究课题。您可以在此处找到更多信息http://arxiv.org/abs/0909.4061、此处为http://arxiv.org/abs/0909.4061和此处为http://arxiv.org/abs/0809.2274。这里有可用的代码:http ://code.google.com/p/redsvd/但您不能只将现成的用于您正在谈论的数据大小。

您可以解决此问题的另一种方法是查看“增量 svd”,它可能更适合您的问题,但有点复杂。考虑这个注释:http ://www.cs.usask.ca/~spiteri/CSDA-06T0909e.pdf和这个论坛:https ://mathoverflow.net/questions/32158/distributed-incremental-svd

于 2012-04-03T00:50:05.113 回答