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 - Haskell

GSLHaskellというライブラリを使った
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import Data.Complex
import Data.List

import GSL.LinearAlgebra.Algorithms (eigR)
import GSL.LinearAlgebra.Matrix (fromLists, toColumns)
import GSL.LinearAlgebra.Vector (toList)

testdata = [[2,3,4,5,7],[1],[1,2],[2,3,5],[1,3,4,6],[1,5],[5]]

pageRank = normalize      -- 確率ベクトルへの正規化
         . map realPart   -- 実数部分の取り出し
         . toList         -- GSLモジュールのベクトルデータからリストに変換
         . head           -- 最大固有値に対応する固有ベクトルの取り出し
         . toColumns      -- 固有ベクトルのリストに変換
         . snd            -- 固有ベクトル(行列データ形式)
         . eigR           -- 固有値計算
         . fromLists      -- GSLモジュールの行列データに変換
         . transMat       -- 遷移確率行列へ変換
         . list2mat       -- 隣接リストから隣接行列へ変換

list2mat xs = map (fillup [1..genericLength xs]) xs 
  where fillup xs [] = map (const 0) xs
        fillup (x:xs) yys@(y:ys) | x < y     = 0 : fillup xs yys
                                 | otherwise = 1 : fillup xs ys

transMat = transpose . map (normalize . map fromInteger)

normalize xs = map (/s) xs where s = sum xs

{-
*Main> pageRank testdata
[0.3035143769968052,0.16613418530351437,0.14057507987220447
,0.10543130990415339,0.17891373801916938,4.4728434504792317e-2
,6.070287539936104e-2]
-}

Index

Feed

Other

Link

Pathtraq

loading...