MAT1110 - Oblig 1 Halvard Sutterud 22. september 2016 Sammendrag I dette prosjektet skal vi se på anvendelsen av lineær algebra til å generere rangeringer av nettsider i et web basert på antall hyperlinker mellom dem. Introduksjon Definisjon 1: For hver j 1, 2,..., n definerer vi n j til å være antall dokumenter som dokumentet nj refererer til ved hjelp av hyperlenker Definisjon 2: Vi definerer n n link-matrisen A = [a ij ] ved at a ij = 1 n j hvis dokument nr. j har hyperlenke til dokument nr i, og a ij = 0 ellers. Vi er ute etter å bestemme fornuftig score x 1, x 2,..., x n der x i skal være score til dokument nr. i. En score skal være et ikke-negativt tall mindre eller lik 1, og en høy verdi skal indikere stor relevans. Hvis tallene x 1, x 2,..., x n har sum 1, så vil vi kalle vektoren x = (x 1, x 2,..., x n ) for score-vektor. Dette kalles også for en sannsynlighetsvektor. En måte å regne ut en score-vektor x for en web med link-matrise A er å kreve at x er en løsning av likningen eller alternativt av det homogene systemet Ax = x (1) (A I)x = 0 (2) der I betegner identitetsmatrisen. Det er ikke sikkert at det finnes en unik score-vektor. Gitt en score-vektor så kan vi liste opp dokumentene etter avtagende score. En slik opplisting kalles en rangering. Vi vil si at rangeringen er unik hvis score-vektoren er unik. (2) sier at en vektor x tilhører nullrommet for matrisen 1 Diverse ikke-verdensomspennede web 1.1 Et enkelt web Gitt webet i figur 1, vil vi finne link-matrisen A. Vi ser at dokument 1 peker på alle andre dokumenter, så første kolonne i A blir (0, 1/3, 1/3, 1/3). Andre dokument peker på dokument 3 1
1 4 2 3 Figur 1: Et nett bestående av fire noder, koblet sammen på spennende vis og 4, så andre kolonne blir (0, 0, 1/2, 1/2). Tilsvarende finner vi at tredje og fjerde kolonne blir henholdsvis (1, 0, 0, 0) og (1/2, 0, 1/2, 0). Matrisen blir da 0 0 1 1/2 1/3 0 0 0 1/3 1/2 0 1/2 (3) 1/3 1/2 0 0 Vi vil løse likningssystemet oppgitt i likning (2). For å finne en basis for nullrommet til A I, radreduserer vi matrisen. Vi radreduserer(radreduksjonen ble gjort for hånd, og beviset overlates som en oppgave til leseren), og får 1 0 0 2 rref(a I) = 0 1 0 2/3 0 0 1 3/2, (4) 0 0 0 0 som korresponderer til en løsning på formen x = (2u, 2/3u, 3/2u, u), der u er et fritt valgt reelt tall. For at vektoren vår skal være en stokastisk vektor, krever vi at den har sum 1. Vi ser ved inspeksjon at vår ettertraktede score-vektor da er x = (12/31, 4/31, 9/31, 6/31). 1.2 Usammenhengende web Figur 2 viser det vi kaller et usammenhengdende web, det vil si at weben kan deles opp i deler som ikke refererer til hverandre. Linkmatrisen for dette webet er gitt ved 2
1 3 5 2 4 Figur 2: Et usammenhengende nett. I tillegg er det ingen noder som peker på node 5, stakar 0 1 0 0 0 1 0 0 0 0 A = 0 0 0 1 0.5 0 0 1 0 0.5. (5) 0 0 0 0 0 Vi finner igjen en basis for nullrommet til A ved å radredusere A I(overlates til leseren å vise), og får 1 1 0 0 0 0 0 0 0 0 rref(a I) = 0 0 1 1 0 0 0 0 0 0. (6) 0 0 0 0 1 1.3 Stokastiske link-matriser De to forrige matrisene er begge stokastiske, da alle elementene er større eller lik null, og summen av hver kolonne er 1. En link-matrise kan derimot være ikke-stokastisk dersom en av dokumentene ikke lenker til noen andre dokumenter. 1.4 Google-matriser Det er lettere å finne unik rangering dersom link-matrisen er stokastisk. HviseA er link-matrisen til en web med n dokumenter, og m er et valgt tall slik at 0 < m < 1, definerer vi en ny n n matrise M ved M = (1 m)a + ms, (7) der S er n n matrisen der alle koeffisientene er 1 2. M kalles ofte Google-matrisen til weben (for den valgte m). Legg merke til at M kan betraktes som link-matrisen til en sammenhengende web, selv om A representerer link-matrisen til en usammenhengende web. 3
Vi antar at A er stokastisk. Da vil alle kolonnene i (1 m)a ha sum 1 m, siden kolonnene i A har sum 1. Samtidig vil kolonnene i ms ha sum m n n = m, og kolonnene i M har dermed sum 1 m + m = 1. Siden A er stokastisk, vil ikke elementene i M ha større verdi enn maximalt (1 m) + m 1 n < 1. Vi har også at alle elementene i M er større enn null, og matrisen er derfor regulær (første potens av matrisen har bare ekte positive tall). Teorem 4.18 sier at den dermed har en unik score-vektor. 1.5 En spesifikk Google-matrise Vi finner Google-matrisen til det usammenhengende webet vi så på tidligere til å være 0.03 0.88 0.03 0.03 0.03 0.88 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.88 0.455 0.03 0.03 0.88 0.03 0.455. (8) 0.03 0.03 0.03 0.03 0.03 Vi bruker python til å finne nullrommet til denne matrisen(koden brukt til å finne både matrisen og nullrommet er vist nedenfor i figur 3), og finner at nullrommet er gitt ved 0.405 0.405 u 0.578 0.578. (9) 0.061 1 import numpy as np 2 from mat1120lib import null 3 4 m = 0.15 5 n = 5 6 S = 1/ float (n) * np. ones ((5,5) ) 7 A = np. array (((0,1,0,0,0), 8 (1,0,0,0,0), 9 (0,0,0,1,0.5), 10 (0,0,1,0,0.5), 11 (0,0,0,0,0) )) 12 13 M = (1 -m)*a + m*s 14 n = null (M- np. eye (5) ) # normalized 15 solution = n/ np. sum (n) 16 solution Figur 3: Python script for å finne nullrommet til en Google-matrrisen for et gitt web, med m = 0.15 Deler vi denne vektoren på summen av elementene sine, får vi den unike score-vektoren til M: 4
0.200 0.200 x = 0.285 0.285. (10) 0.030 1.6 En metode for å generere link-matriser Vi skal nå se nærmere på python-funksjonen randlinkmatrix i figur 4. Koden starter med en n n matrise, der alle elementene er enten null eller en. Deretter går den gjennom indexene fra 0 til 1 og gjør to ting: den setter diagonalen lik null, setter siste element lik en dersom summen av en kolonne er lik null, og sørger for at alle kolonnene har sum lik 1 ved å dele hver kolonne på summen av elementene. 1 def randlinkmatrix (n): 2 A = np. round ( np. random. random ((n,n))) # gives float array 3 for k in range (n): 4 A[k,k] = 0 5 if np. sum (A.T[k]) == 0: 6 if k!= n -1: 7 A[n -1,k] = 1 8 else : 9 A[0,n -1] = 1 10 s = np. sum (A.T[k]) 11 A.T[k] = A.T[k] *1./ s 12 return A Figur 4: En pythonfunksjon som genererer nesten tilfeldige stokastiske link-matriser 1.7 Et spesifikt tilfeldig generert web En kjøring av den oppgitte funksjonen med n = 5, gir 0.000 0.250 0.000 1.000 0.000 0.500 0.000 0.500 0.000 0.000 0.500 0.250 0.000 0.000 0.500 0.000 0.250 0.500 0.000 0.500, (11) 0.000 0.250 0.000 0.000 0.000 som representerer et web som vil se ut som vist i figur 5 5
4 5 3 1 2 Figur 5: Et web som generert av en tilfeldig link-generator for n = 5 noder. Tilfeldigheten er likevel ikke helt uniform, da elementer langs diagonalen i link-matrisen (noder som peker på seg selv) blir erstattet med en link til den siste noden (evt første hvis den siste er utgangspunktet) i de kolonnene der diagonalelementet er eneste ikke-null element 1.8 Finne rangering Vi lager nå en funksjon ranking.py som kan sees i figur 6. 1 def ranking (A): 2 import numpy as np 3 from mat1120lib import null 4 5 if A. shape [0] == A. shape [1] and len (A. shape ) == 2: 6 n = A. shape [0] 7 8 else : 9 n=0 10 print "A is not a square matrix, aborting!" 11 import sys 12 sys. exit (1) 13 tol = 1e -12 14 for i in range (n): 15 if ( np. sum (A.T[i]) -1) > tol : 16 print "A is not a stochastic matrix, aborting!" 17 import sys 18 sys. exit (1) 19 S = 1/ float (n) * np. ones ((n,n)) 20 m = 0.15 21 22 M = (1 -m)*a + m*s 23 n = null (M- np. eye (n)) # normalized 24 return n/ np. sum (n) Figur 6: Funksjonen tar inn en n n stokastisk matrise og finner den unike score-vektoren for en Google-matrise M produsert fra matrisen. 6
1.9 Approksimere rangering Siden det er vanskelig (mange regneoperasjoner) å regne ut nullrommet til veldig store matriser, skal vi finne en måte å finne en approksimasjon til score-vektoren. Måten vi finner vil kunne utnytte at A vil inneholde veldig mange 0-ere. Vi setter x 0 = ( 1 n,..., 1 n ) og definerer x 1 = Mx 0, x 2 = Mx 1, osv. Med andre ord x k = Mx k 1 for k 1. (12) Sekvensen x 1, x 2, x 3,... er da en Markov-kjede assosiert med M. Vi skriver et program for å generere konvergensen av disse kjedene. Det er en del copy paste fra tidligere program. Den relevante delen av pgrorammet sees i figur re 7. Vi kjører programmet på matrisen i likning (8), og ser at vi har konvergens mot en tilfredsstillende løsning etter bare to iterasjoner! Konge! 1 2 def rankingapprox (A, delta = 0.0001) : 3... 4... # error checking and setting up M 5... 6 7 x = 1./ n* np. ones (n) 8 xnew = np. dot (M, x) 9 10 iterations = 1 11 while np. max ( np. abs ( xnew -x)) > delta and iterations < 100: 12 x = xnew 13 xnew = np. dot (M, xnew ) 14 iterations += 1 15 return xnew, iterations Figur 7: Funksjonen rankingapprox.py tar inn en n n stokastisk matrise og finner en approximasjon til den unike score-vektoren ved Markov-kjede iterasjoner i en for-løkke 1.10 En sammenlikning Vi anvender begge python funksjonene, både ranking.py og rankingapprox.py, på den første link-matrisen vi så på, nemlig 0 0 1 1/2 A = 1/3 0 0 0 1/3 1/2 0 1/2. 1/3 1/2 0 0 Dette resulterte i at de to vektorene x 1 = ranking(a) og x 2 = rankingapprox(a) fikk verdiene 0.368151 0.366395 x 1 = 0.141809 0.287962 x 2 = 0.142239 0.288397 0.202078 0.202969 etter 6 iterasjoner. 7
Konklusjon Lineær algebra har nyttige konsekvenser for søkemotorer, som baserer mye av sin forretningsmodell på å rangere nettsider etter relevans. Vi har sett på noen implementasjoner av enkle algoritmer for å finne score-vektorer fra stokastiske, regulære matriser. 8