【问题标题】:Is it possible to do pagerank without the entire dataset?是否可以在没有整个数据集的情况下进行 pagerank?
【发布时间】:2012-04-03 00:19:27
【问题描述】:

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

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

这有意义吗?如果可以,可以吗?

【问题讨论】:

  • 我猜Riak可以处理更大的数字,它可以通过MapReduce遍历链接

标签: graph graph-theory neo4j pagerank


【解决方案1】:

您需要计算 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.4061http://arxiv.org/abs/0909.4061http://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

【讨论】:

  • 哎呀..似乎比我希望的要复杂得多。我希望有一个解决方案可以让我从以前的数据集中获取 pagerank 并将该属性应用于当前集(因为我只关心当前节点集的 pagerank)。我需要一些时间来消化你写的东西,但我会通读那些文档
  • 由于pagerank依赖于整个网络,我认为你在查找更新后的排名时不能轻易忽略旧数据。增量方法解决了这个问题(见最后一个链接),但我不知道你是否可以不做一些复杂的事情就逃脱。
猜你喜欢
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 2011-01-04
  • 2018-02-13
  • 2011-07-24
  • 1970-01-01
相关资源
最近更新 更多