2012-04-03 16 views
6

申し訳ありませんこれはばかだが、私はちょうど私がショットを与えるべきだと思っていた。巨大なグラフ(例えば、1000億ノード)があるとします。 Neo4Jは32億をサポートしていますが、多かれ少なかれ同じようにサポートしていますので、データセット全体を同時にデータベースに入れることはできません。有向グラフ(ループなし)と各ノードセットが接続する次のノードセットに移動します(新しいリンクは逆方向には作成されません。新しいデータセットには新しいリンクのみが作成されます)。データセット全体がなくてもページランクを行うことは可能ですか?

私は何とか以前のページランクの得点を受け取り、それらを新しいデータセットに適用する方法はありますか(最新のデータセットのページランクだけを気にしますが、最後のセットデータを得るには前のセットのページランクが必要です)

それは意味がありますか?もしそうなら、それは可能ですか?

+0

私はRiakには、より大きな数字を扱うことができ、それはたくさんより複雑な私が望んでいたものよりもMapReduceの – aitchnyu

答えて

5

1000億〜1000億の行列の原固有ベクトルを計算する必要があります。非常に疎でない限り、あなたはあなたのマシンの中にそれを収めることはできません。したがって、一度に行列の小さな部分だけを見ることができるときに、行列の主要な固有ベクトルを計算する方法が必要です。

固有ベクトルを計算する反復メソッドでは、反復ごとに少数のベクトルを格納する必要があります(各ベクトルには1000億の要素があります)。それらはあなたのマシンに合うかもしれません(4バイトの浮動小数点数はベクトルあたり約375GB必要です)。候補ベクトルを取得したら、(非常にゆっくりと)巨大な行列を塊で読み込むことができます(3つの塊よりもわずかに必要な場合は300億行を見ることができます)。このプロセスを繰り返し、pagerankで使用されるパワーメソッドの基本を持っていきます。 cf http://www.ams.org/samplings/feature-column/fcarc-pagerankおよびhttp://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/ですが、あなたが話しているデータサイズに対してその既製品を使うことはできません。

もう1つの方法として、「インクリメンタルsvd」を調べることで問題に適していますが、もう少し複雑です。このノートを考えてみましょう:http://www.cs.usask.ca/~spiteri/CSDA-06T0909e.pdfとこのフォーラム:https://mathoverflow.net/questions/32158/distributed-incremental-svd

+0

yikes..seemsによって** **リンクを通過することができますね。私は以前のデータセットからページランクを取得し、そのプロパティを現在のセットに適用できるソリューションがあることを期待していました(私はノードの現在のセットのページランクのみを気にしています)。あなたが書いたものを消化するのにはしばらく時間がかかりますが、私はそれらのドキュメントを読むでしょう – Lostsoul

+0

ページランクはネットワーク全体に依存するので、私は更新されたランキングを見つけるときに古いデータを簡単に無視できるとは思わない。インクリメンタルメソッドはこれに対処しています(最後のリンクを参照してください)が、何か複雑なことをせずに立ち去ることができるかどうかはわかりません。 – dranxo

関連する問題