Comment detail

PageRankの計算 (Nested Flatten)

This comment is reply for 2351 にしお: #2349の7行目は何をやっているのかよ...(PageRankの計算). Go to thread root.

>固有値の絶対値の最大値が存在する位置をインデックス値として
>一列分取り出す、と解釈したものがあの7行目です。

なるほどなるほど。
「最大固有値は(少なくともNumPyを使って固有値を求めた場合は)0番目にある」
と解釈したのが僕のコードです。

最大固有値が何番目にあるのかをチェックするバージョンも作ってみました。

# あと余談ですがnumpyはLAPACKを使っているということがわかったのでタグを付けときます
 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
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],
}

m = [[1.0 / len(data[j]) if i in data[j] else 0
      for j in range(1, 8)]
      for i in range(1, 8)]

from numpy import array
from numpy.linalg import eig

(v, d) = eig(array(m))

max_v = list(v).index(max(v))
pagerank = [abs(row[max_v]) for row in d]
k = sum(pagerank)
pagerank = [x / k for x in pagerank]

print pagerank
知識がある人には0でOKという、目算がつくようですね。
これは知識の差がコードの違いに現れるという、よくある
状況のわかりやすい一例かもしれませんね。

ついでにarrayのスライスについて、ちょっと書いておきますと
「a[:, i]」という構文はちょっと見、ありえなさそうに思えますが、
これが「a[i1:i2:i3, j1:j2:j3]」の省略形と分かれば納得できるでしょう。
大体予想できるでしょうが、これは行方向のスライスと列方向のスライスを
コンマで区切った表記方法です。

ざっと試したところ、MLab.array、numpy.array、scipy.arrayの3つ共に
使えるようです。

Index

Feed

Other

Link

Pathtraq

loading...