ページランクに使う確率の正方行列を生成するコードを書いた

プログラミング

読んでくれてありがとうございます。

先日、大学の講義でGoogleのPageRank(ページランク)について勉強する機会がありました。

ページランクというのは、Webページの重要性を表す指標です。Webページごとの被リンクの数を使って求められます。

その講義で、私はページランクを使った自作の問題を作る必要がありました。4つのページのページランクを求める例題を解いていて、そこで私が思いついたのが10ページのページランクを求める問題です。

しかし、nページのページランクを求めるには、n行n列の正方行列を作る必要があります。

10行10列の正方行列でも、行列によってはページランクを求められないようでした。

手書きで100個の要素を何回も書き直すのに疲れたため、Pythonで10行10列の正方行列を生成するコードを書くことにしました。ペーランク以外に使いみちはほとんどないと思いますが、ここに残しておきます。

【正方行列の条件】

  • 対角要素はすべて0.1とする
  • どの列も要素を全部足すと1になるようにする
  • 他のページに移動する確率は同じページであれば、対角要素以外はすべて等しくなるようにする

10行10列の正方行列を生成するコード↓

import random

A1 = [0.1,0,0,0,0,0,0,0,0,0]
A2 = [0,0.1,0,0,0,0,0,0,0,0]
A3 = [0,0,0.1,0,0,0,0,0,0,0]
A4 = [0,0,0,0.1,0,0,0,0,0,0]
A5 = [0,0,0,0,0.1,0,0,0,0,0]
A6 = [0,0,0,0,0,0.1,0,0,0,0]
A7 = [0,0,0,0,0,0,0.1,0,0,0]
A8 = [0,0,0,0,0,0,0,0.1,0,0]
A9 = [0,0,0,0,0,0,0,0,0.1,0]
A10 = [0,0,0,0,0,0,0,0,0,0.1]
AA = [A1, A2, A3, A4, A5, A6, A7, A8, A9, A10]

output = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
for x in range(10):
    output[x] = random.randint(1,6)

dsts = []


for x, i in zip(output, range(10)):
    while True: 
        dsts.append(random.sample(range(1,11),x))
        if not(i + 1) in dsts[i]:
            break  
        else:
            dsts.pop(i)
probs = []
# n 番目の要素が n 列目の 0.1 以外の出リンクの確率を表す配列を作成 
for x in range(10):
    probs.append(0.9 / output[x])

for dst, i in zip(dsts, range(10)):
    for d in dst:    
        AA[i][d - 1] = probs[i]

B1 = [0.1,0,0,0,0,0,0,0,0,0]
B2 = [0,0.1,0,0,0,0,0,0,0,0]
B3 = [0,0,0.1,0,0,0,0,0,0,0]
B4 = [0,0,0,0.1,0,0,0,0,0,0]
B5 = [0,0,0,0,0.1,0,0,0,0,0]
B6 = [0,0,0,0,0,0.1,0,0,0,0]
B7 = [0,0,0,0,0,0,0.1,0,0,0]
B8 = [0,0,0,0,0,0,0,0.1,0,0]
B9 = [0,0,0,0,0,0,0,0,0.1,0]
B10 = [0,0,0,0,0,0,0,0,0,0.1]

BB = [B1, B2, B3, B4, B5, B6, B7, B8, B9, B10]
for i in range(10):
    for j in range(10):
        BB[j][i] = AA[i][j]

print(AA)


for i in range(10):
    for j in range(10):
        print(str(BB[i][j]).rjust(6), end='')
        if j != 9:
            print(', ', end='')
        else:
            print(';') 

実行結果は次のような感じになります。

    0.1,      0,   0.18,      0,      0,    0.9,   0.45,  0.225,      0,      0;
      0,    0.1,      0,    0.9,      0,      0,      0,      0,   0.18,      0;
    0.3,      0,    0.1,      0,      0,      0,      0,  0.225,   0.18,   0.15;
    0.3,    0.3,      0,    0.1,      0,      0,      0,      0,      0,      0;
      0,      0,   0.18,      0,    0.1,      0,      0,      0,   0.18,   0.15;
      0,    0.3,      0,      0,      0,    0.1,      0,      0,      0,   0.15;
      0,    0.3,   0.18,      0,      0,      0,    0.1,  0.225,      0,   0.15;
    0.3,      0,      0,      0,      0,      0,   0.45,    0.1,   0.18,   0.15;
      0,      0,   0.18,      0,      0,      0,      0,  0.225,    0.1,   0.15;
      0,      0,   0.18,      0,    0.9,      0,      0,      0,   0.18,    0.1;

MATLABというソフトで使えるように「,」で区切り「;」で改行するようにしています。

使えればいいやと思って書いたので、コードの汚さはご容赦下さい💦

コメント

タイトルとURLをコピーしました