読んでくれてありがとうございます。
先日、大学の講義で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というソフトで使えるように「,」で区切り「;」で改行するようにしています。
使えればいいやと思って書いたので、コードの汚さはご容赦下さい💦
コメント