In [1]:
%pylab
%matplotlib inline
Metoden som brukes for å finne en egenvektor er potensmetoden.
Eksempelmatrisen til PageRank-eksempelet, se 13.3 i kompendiet
In [2]:
A1 = array([
[0, 1, 0, 0, 0, 0 ],
[1, 0, 0, 0, 0, 1 ],
[0, 0, 0, 1/3, 1/2, 0 ],
[0, 0, 0, 0, 0, 0 ],
[0, 0, 0, 1/3, 0, 0 ],
[0, 0, 1, 1/3, 1/2, 0 ] ])
brus = 1/6*array([
[1,1,1,1,1,1],
[1,1,1,1,1,1],
[1,1,1,1,1,1],
[1,1,1,1,1,1],
[1,1,1,1,1,1],
[1,1,1,1,1,1]])
A = .85*A1 + .15*brus
In [3]:
import networkx
G = networkx.from_numpy_matrix(A1.T, create_using=networkx.MultiDiGraph())
networkx.draw_networkx(G)
In [4]:
feil = 0.0001
x = rand(6) # tilfeldig valgt vektor x
x = x/norm(x) # nå har x lengde 1
for i in range(200):
Ax = dot(A,x) # fordi vi trenger å huske to vektorer
Ax = Ax/norm(Ax) # lengde 1 igjen
if norm(Ax-x) < feil: # hvis vi er nær nok en egenvektor
break
x = Ax
Nå er x en egenvektor (omtrent).
In [5]:
x = x/sum(x)
# nå representerer verdiene i x sannsynligheter.
# Det er disse tallene pagerank bruker for å rangere nettsidene,
# fra størst til minst verdi.
In [6]:
bar(arange(len(x)),x)
Out[6]: