In [1]:
%pylab
%matplotlib inline


Using matplotlib backend: MacOSX
Populating the interactive namespace from numpy and matplotlib

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]:
<Container object of 6 artists>