JavaでPageRankアルゴリズム
有名なgoogleのPageRankアルゴリズム。<br />
今更ながらどうやって実装してるのか調べてみました。<br />
<br />
評価の高いページに参照されてるページは評価が高いはず、の仮説に基づいているのは有名な話ですが、実際にこれをコードに落としこむロジックはなかなか綺麗で良くできているものだと感心してしまいました。<br />
<br />
<a href="http://ilpubs.stanford.edu:8090/361/1/1998-8.pdf" target="_blank">論文</a>に書かれている再帰的な数式をどうプログラムで表現すべきか、的な話はこちらが詳しいので興味を持った方はご参照を。<br />
<br />
<a href="http://d.hatena.ne.jp/smly/20090228/1235792969" target="_blank">リンク解析とか: 重要度尺度と von Neumann カーネル</a><br />
<br />
<!--more--><br />
<br />
今回はこのPageRankをJavaで実装してみようと思いました。<br />
はじめは普通にPowerMethodをJavaで実装しようかと思ったんですが、使いやすそうなライブラリを見っけたのでこれを使って書いて見ることにしました。<br />
<div class="p1">
<br />
利用したのは<a href="http://jung.sourceforge.net/" target="_blank">Jung(Java Universal Network/Graph Framework)</a>というネットワーク・グラフ解析用のライブラリ。JungにはHITSやPageRankなどノード間をスコア付けするクラスが多数含まれています。<br />
<br />
実際にサンプルコードを書くと次のようになりました。<br />
<br />
<pre class="brush: javascript;" type="syntaxhighlighter"> Graph<Integer, Integer> g = new DirectedOrderedSparseMultigraph<Integer, Integer>();
// add 5 nodes to graph model.
g.addVertex(0);
g.addVertex(1);
g.addVertex(2);
g.addVertex(3);
g.addVertex(4);
// add edge to graph model
g.addEdge(0, 0,1,EdgeType.DIRECTED); // directed edge from 0 to 1
g.addEdge(1, 0,2,EdgeType.DIRECTED); // directed edge from 0 to 2
g.addEdge(2, 1,2,EdgeType.DIRECTED); // directed edge from 1 to 2
g.addEdge(3, 1,3,EdgeType.DIRECTED);
g.addEdge(4, 2,1,EdgeType.DIRECTED);
g.addEdge(5, 2,2,EdgeType.DIRECTED);
g.addEdge(6, 2,3,EdgeType.DIRECTED);
// calculate the page rank.
PageRank<Integer,Integer> pr = new PageRank<Integer,Integer>(g,0.2);
pr.evaluate();
System.out.println(g);
for (Integer i : g.getVertices()) {
System.out.println(pr.getVertexScore(i));
}
</pre>
<br />
<br />
なんて簡単。<br />
しかし、もうpagerankも学術用ライブラリに普通にはいってるご時世なんですね。</div>
<br />
<br />
<br />
おまけ。<br />
せっかくなので各種言語でサンプルコードやライブラリを集めてみました。<br />
<br />
<br />
<h3>
python</h3>
<a href="http://d.hatena.ne.jp/smly/20090228/1235792969" target="_blank">リンク解析とか: 重要度尺度と von Neumann カーネル</a>(冒頭で紹介したサイト)<br />
<br />
<h3>
</h3>
<h3>
perl</h3>
<a href="http://d.hatena.ne.jp/naoya/20090305/1236255363%22" target="_blank">PDL で PageRank</a><br />
<br />
<h3>
ruby</h3>
<a href="http://d.hatena.ne.jp/yyuto/20091029/1256829755" target="_blank">PageRankをRubyで実装</a><br />
<br />
<h3>
C++</h3>
<a href="http://yoheiz.blogspot.jp/2007/09/pagerank-c.html" target="_blank">初投稿 PageRankの計算 C++でどう書く?</a><br />
<br />
<br />
今更ながらどうやって実装してるのか調べてみました。<br />
<br />
評価の高いページに参照されてるページは評価が高いはず、の仮説に基づいているのは有名な話ですが、実際にこれをコードに落としこむロジックはなかなか綺麗で良くできているものだと感心してしまいました。<br />
<br />
<a href="http://ilpubs.stanford.edu:8090/361/1/1998-8.pdf" target="_blank">論文</a>に書かれている再帰的な数式をどうプログラムで表現すべきか、的な話はこちらが詳しいので興味を持った方はご参照を。<br />
<br />
<a href="http://d.hatena.ne.jp/smly/20090228/1235792969" target="_blank">リンク解析とか: 重要度尺度と von Neumann カーネル</a><br />
<br />
<!--more--><br />
<br />
今回はこのPageRankをJavaで実装してみようと思いました。<br />
はじめは普通にPowerMethodをJavaで実装しようかと思ったんですが、使いやすそうなライブラリを見っけたのでこれを使って書いて見ることにしました。<br />
<div class="p1">
<br />
利用したのは<a href="http://jung.sourceforge.net/" target="_blank">Jung(Java Universal Network/Graph Framework)</a>というネットワーク・グラフ解析用のライブラリ。JungにはHITSやPageRankなどノード間をスコア付けするクラスが多数含まれています。<br />
<br />
実際にサンプルコードを書くと次のようになりました。<br />
<br />
<pre class="brush: javascript;" type="syntaxhighlighter"> Graph<Integer, Integer> g = new DirectedOrderedSparseMultigraph<Integer, Integer>();
// add 5 nodes to graph model.
g.addVertex(0);
g.addVertex(1);
g.addVertex(2);
g.addVertex(3);
g.addVertex(4);
// add edge to graph model
g.addEdge(0, 0,1,EdgeType.DIRECTED); // directed edge from 0 to 1
g.addEdge(1, 0,2,EdgeType.DIRECTED); // directed edge from 0 to 2
g.addEdge(2, 1,2,EdgeType.DIRECTED); // directed edge from 1 to 2
g.addEdge(3, 1,3,EdgeType.DIRECTED);
g.addEdge(4, 2,1,EdgeType.DIRECTED);
g.addEdge(5, 2,2,EdgeType.DIRECTED);
g.addEdge(6, 2,3,EdgeType.DIRECTED);
// calculate the page rank.
PageRank<Integer,Integer> pr = new PageRank<Integer,Integer>(g,0.2);
pr.evaluate();
System.out.println(g);
for (Integer i : g.getVertices()) {
System.out.println(pr.getVertexScore(i));
}
</pre>
<br />
<br />
なんて簡単。<br />
しかし、もうpagerankも学術用ライブラリに普通にはいってるご時世なんですね。</div>
<br />
<br />
<br />
おまけ。<br />
せっかくなので各種言語でサンプルコードやライブラリを集めてみました。<br />
<br />
<br />
<h3>
python</h3>
<a href="http://d.hatena.ne.jp/smly/20090228/1235792969" target="_blank">リンク解析とか: 重要度尺度と von Neumann カーネル</a>(冒頭で紹介したサイト)<br />
<br />
<h3>
</h3>
<h3>
perl</h3>
<a href="http://d.hatena.ne.jp/naoya/20090305/1236255363%22" target="_blank">PDL で PageRank</a><br />
<br />
<h3>
ruby</h3>
<a href="http://d.hatena.ne.jp/yyuto/20091029/1256829755" target="_blank">PageRankをRubyで実装</a><br />
<br />
<h3>
C++</h3>
<a href="http://yoheiz.blogspot.jp/2007/09/pagerank-c.html" target="_blank">初投稿 PageRankの計算 C++でどう書く?</a><br />
<br />
<br />
コメント
コメントを投稿