challenge PageRankの計算

ページランク - Wikipediaを求めるプログラムを作ってください。(PageRankはGoogleの商標です)

詳しい導出方法はGoogle の秘密 - PageRank 徹底解説の3章に載っていますが、 簡単に説明すると

  1. ページがn枚ある場合、n×nの2次元配列を用意する。
  2. ページiからページjにリンクがある場合、mat[j][i] = 1 / num_link[i]とする。ただしnum_link[i]はi番目のページから出ているリンクの総数。
  3. 行列計算ライブラリを使ってできあがった2次元配列の固有値、固有ベクトルを求める。
  4. 出力された固有ベクトルから合計が1になるようなPageRankを算出する

という流れになります。

Pythonで表現すると下のようになります。 ?????の部分は空行を入れて10行でしたので 何百行ものコードになってしまった場合は きっとお題の趣旨から外れていると思います。 このお題の趣旨は「行列計算ライブラリを使って」PageRankを計算することなので、 自力で固有値の計算を実装することは求められていません。

data = {
    1: [2, 3, 4, 5, 7],
    2: [1],
    3: [1, 2],
    4: [2, 3, 5],
    5: [1, 3, 4, 6],
    6: [1, 5],
    7: [5],
}

?????

print pagerank
# [0.303514376997, 0.166134185304, 0.140575079872,
#  0.105431309904, 0.178913738019, 0.0447284345048,
#  0.0607028753994]
このお題はところてんさんの「行列演算系のお題が欲しい」という要望を元に考えたものです。ありがとうございました。

Posted feedbacks - JavaScript

 ライブラリを使えということなので、dojo(0.4.3)を。やってることは#2335とほぼ同じです。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
(function(data){ with(dojo.math.matrix){
  var size = 0, i, j, l;
  for(i in data) size++;
  var m = zeros(size, size), pr = create(1, size, 1 / size);
  for(i in data) for(j = l = data[i].length; j--;)
    m[data[i][j] - 1][i - 1] = 1 / l;
  for(var diff = 1, nx; diff > ALMOST_ZERO; pr = nx){
    nx = multiply(m, pr);
    for(diff = 0, j = size; j--;) diff += Math.abs(nx[j][0] - pr[j][0]);
  }
  (typeof WSH != 'undefined' ? function($){WSH.echo($)} : confirm)(format(pr));
}})({
 1: [2, 3, 4, 5, 7],
 2: [1],
 3: [1, 2],
 4: [2, 3, 5],
 5: [1, 3, 4, 6],
 6: [1, 5],
 7: [5]
});

Index

Feed

Other

Link

Pathtraq

loading...