viewgit/index.php:465 Only variables should be passed by reference [2048]

viewgit/index.php:466 Non-static method GeSHi::get_language_name_from_extension() should not be called statically [2048]

  1. \chapter{Page Rank}
  2. In questo capitolo ci porremo il problema di calcolare il \emph{page rank} di un determinato
  3. insieme di pagine Web (o, analogamente, documenti \emph{ipertestuali}). \\
  4. Con Page Rank intendiamo un ``voto'' che viene dato ad una determinata pagina o documento
  5. che stima la sua importanza. Un algoritmo derivato da quello che verrà in seguito
  6. esposto è utilizzato attualmente da Google (\href{http://www.google.it}{http://www.google.it})
  7. per ordinare i risultati di una query nel suo motore di ricerca, così come da tutti i principali
  8. \emph{search engine} presenti sul Web.
  9.  
  10. \section{Presentazione del modello}
  11. Prima di tutto dobbiamo occuparci di definire il modello matematico che vogliamo usare
  12. per schematizzare la nostra valutazione di importanza. \\
  13. In generale l'idea che sta alla base del Page Rank è dare importanza ad una pagina
  14. basandosi sui link\footnote{Un link in una pagina Web, ma anche in un documento PDF come questo
  15. è un ``puntatore'' ad un altro documento. In genere l'utente può attivare il puntatore semplicemente
  16. cliccandoci sopra con il mouse} che in essa sono presenti.
  17.  
  18. Alcune idee che potrebbero sembrare valide potrebbero essere valutare l'importanza di una pagina
  19. in base al numero di link presenti nella pagina, oppure al numero di link che puntano ad essa.
  20.  
  21. Dopo una breve riflessione ci si rende conto che entrambi i metodi introducono svariate problematiche
  22. di affidabilità. In generale, infatti, il creatore di una pagina ha il controllo di quanti link
  23. sono presenti in una pagina, e non fatica molto a creare delle pagine fittizie che puntano a quella
  24. appena creata. La valutazione sarebbe quindi falsata e molto vulnerabile a frode.
  25.  
  26. Si può però cercare di affinare l'idea di base in modo da risolvere questi inconvenienti.
  27. Per convenzione assumiamo di numerare tutte le pagine presenti nel Web con dei numeri naturali
  28. $1 \ldots N$ (dove $N$ è un numero dell'ordine di $10^{10}$).
  29. Fissata una certa pagina $j$ consideriamo i link che puntano a lei. Risulta chiaro che non solo
  30. il \textbf{numero} dei link è importante per valutare la sua importanza, ma a sua volta anche l'\textbf{importanza}
  31. di questi dovrebbe influire. Per esempio, se la homepage di Yahoo! punta
  32. alla pagina di una persona, è naturale che questa pagina abbia una certa rilevanza. Viceversa, se sulla
  33. mia pagina personale io metto un link al sito della stessa persona l'importanza di questo varia di poco\footnote{
  34. a meno che nel momento in cui voi leggiate queste pagine io non sia diventato una persona con una certa influenza,
  35. ma questo è probabilmente un caso da scartare}.
  36. Un'ultima e non meno importante considerazione è che se anche Yahoo! punta al mio sito ma lo fa in una pagina
  37. con un altro centinaio di link è una faccenda molto diversa dall'essere puntati dall'unico link in homepage.
  38.  
  39. Stiamo quindi arrivando ad un altro modello, in cui le pagine \emph{distribuiscono la loro importanza fra i link al
  40. loro interno}. Questo modello è molto più ragionevole del precedente, ed è molto meno predisposto a dare
  41. risultati falsati. Vorremo però avere una sua descrizione matematica precisa.
  42.  
  43. \section{Un po' di matematica}
  44. Consideriamo la matrice quadrata $H = (h_{ij})$, che chiameremo \emph{matrice delle connessioni}, definita
  45. nel seguente modo
  46. \[
  47. h_{ij} = \left\{ \begin{array}{ll}
  48. 1 & \text{se esiste un link dalla pagina} \ i \ \text{alla pagina} \ j \\
  49. 0 & \text{altrimenti}
  50. \end{array} \right.
  51. \]
  52. Questa matrice avrà dimensione $N \times N$ ma sarà sparsa, ovvero la maggior parte dei suoi valori saranno $0$.
  53. Per fissare le idee consideriamo la Figura~\ref{fig:web}, un modello (molto) semplificato del Web, in cui esistono solamente
  54. 3 pagine.
  55. \begin{figure}[hb]
  56. \[
  57. \xymatrix{
  58. {\bullet{1}} \ar@/_/[dr] \ar@/^1pc/[drr] & \\
  59. & {\bullet{2}} \ar@/_/[ul]& {\bullet{3}} \ar@/^/[l]}
  60. \]
  61. \caption{Esempio di una rete composta da 3 pagine}
  62. \label{fig:web}
  63. \end{figure}
  64.  
  65. La matrice di connessione $H$ associata a questo grafo è la seguente
  66. \[
  67. H = \left[ \begin{array}{ccc}
  68. 0 & 1 & 1 \\
  69. 1 & 0 & 0 \\
  70. 0 & 1 & 0
  71. \end{array} \right]
  72. \]
  73. \begin{os} \label{os:pageranknumcoll}
  74. \`E facile verificare che valgono le seguenti uguaglianze
  75. \[
  76. \left\{ \begin{array}{ll}
  77. \sharp \{ \text{collegamenti uscenti da} \ i \} & = \sum_{j=1}^{N} h_{ij} \\
  78. \sharp \{ \text{collegamente che arrivano a} \ j \} & = \sum_{i=1}^{N} h_{ij}
  79. \end{array} \right.
  80. \]
  81. \end{os}
  82. In particolare sarebbe piuttosto immediato calcolare, partendo dalla matrice $H$, i valori
  83. del Page Rank con i metodi ipotizzati all'inizio del capitolo (per altro reputati incompleti)
  84.  
  85. Siamo dunque interessati a calcolare il vettore $W$ dove $w_i$ è l'importanza della pagina $i$,
  86. in modo che rispetti le linee guide definite precedentemente.
  87.  
  88. Chiamiamo $d_i$ il numero di link uscenti dalla pagina $i$
  89. (facilmente calcolabile come visto nell'Osservazione~\ref{os:pageranknumcoll}. Chiameremo inoltre
  90. $D$ la matrice con i $d_i$ sulla diagonale e nulla per i restanti valori.
  91. Introdotta questa notazione, secondo il nostro modello ogni componente di $W$ dovrebbe rispettare
  92. la seguente equazione
  93. \[
  94. w_j = \sum_{i=1}^{N} w_i \frac{h_{ij}}{d_i}
  95. \]
  96. che rappresenta esattamente l'idea che l'importanza di ogni pagina è la somma delle importanze di quelle
  97. che la linkano, in cui ogni addendo è normalizzato sul numero di link uscenti\footnote{probabilmente l'equazione
  98. è molto più chiara di questa frase, ma non commentare mi sarebbe sembrato inopportuno}.
  99. \`E quindi chiaro come il nostro problema si sia trasformato in un problema di autovalori ed autovettori. In
  100. particolare, se poniamo $M = D^{-1}H$ la nostra richiesta si può scrivere nella forma più compatta
  101. $\trasp{W} = \trasp{W}M$, ovvero $\trasp{W}$ è un autovettore sinistro di $M$. Sorgono spontanee alcune
  102. domande a cui dobbiamo rispondere prima di procedere oltre.
  103. \begin{enumerate}[(a)]
  104. \item \label{en:pagerank:a} Cosa succede se per qualche $i$ si ha $d_i = 0$? Stiamo tacitamente assumendo che $D$ sia invertibile
  105. ma questo non è garantito a priori;
  106. \item \label{en:pagerank:b} L'autovalore $1$ fa parte dello spettro delle matrice $M$? Se questo non fosse vero la nostra
  107. richiesta non ammette soluzione, e quindi possiamo rinunciare in partenza alla nostra idea;
  108. \item \label{en:pagerank:c} Se l'autovettore $W$ esiste, è unico? (a meno di multipli scalari, ovviamente). Se così non fosse
  109. sorgerebbero dei seri problemi su come interpretare i risultati ottenuti;
  110. \item \label{en:pagerank:d} Possiamo scegliere l'autovettore $W$ in modo che $w_i \geq 0$ per ogni $i$? Questo non è necessario,
  111. a priori, ma sembrerebbe coerente fare in modo che delle votazioni siano numeri positivi;
  112. \end{enumerate}
  113.  
  114. Cominciamo col rispondere alla domanda~(\ref{en:pagerank:a}). Ovviamente potrebbe benissimo succedere
  115. che per qualche $i$ $d_i = 0$. Questi ``nodi'' vengono chiamati \emph{dangling node}, ovvero ``nodi penzolanti'',
  116. che non portano a niente. Per risolvere questo problema si sostituisce la matrice $H$ con una matrice $\hat H$
  117. tale che se $h_ij = 0 \: \forall j$ allora $\hat h_{ij} = 1 \: \forall j$, e in caso contrario $h_{ij} = \hat h_{ij}$.
  118. Questa matrice risolve evidentemente il problema e cambia di poco il modello. Supporre che una determinata pagina
  119. non distribuisca la sua importanza a nessuno o la distribuisca in maniera analoga a tutti non è un gran cambiamento.
  120.  
  121. La domanda~(\ref{en:pagerank:b}) ha invece una risposta immediata. Sì, l'autovalore $1$ fa parte dello spettro
  122. ed un autovettore (destro) a lui associato è quello composto di tutti $1$. La verifica è un banale conto.
  123.  
  124. Per rispondere alle domande~(\ref{en:pagerank:c}) e (\ref{en:pagerank:d}) ci appoggiamo ad un risultato
  125. che non dimostreremo (in questa sede) ottenuto da Perron-Frobenius sulla Teoria delle Matrici non negative.
  126. \begin{te}[di Perron-Frobenius] \label{te:PerronFrobenius}
  127. Se $A$ è irriducibile allora $\rs{A} > 0$ è un autovalore semplice ed
  128. esistono $x,y$ autovettori destro e sinistro
  129. con componenti strettamente positive.
  130. \end{te}
  131. \begin{os}
  132. Sembrerebbe, a priori, che non siamo in grado di determinare il raggio spettrale di $A$. Consideriamo però
  133. che $1$ è nell spettro e che $||A||_{\infty} = 1$ e ogni norma indotta supera il raggio spettrale. Si può
  134. quindi concludere che $\rs{A} = 1$ e quindi possiamo applicare il Teorema~\ref{te:PerronFrobenius}.
  135. \end{os}
  136. Sfortunatamente si può osservare che, pur con tutte queste buone proprietà, in generale i metodi applicati
  137. per trovare l'autovettore (il metodo delle potenze) potrebbe non essere convergente, perché gli autovalori
  138. diversi da $1$ potrebbero ancora avere modulo $1$\footnote{Come visto nella teoria, la velocità di convergenza
  139. del metodo di iterazione è data dal rapporto fra il più grande autovalore diverso da quello di cui si sta cercando
  140. l'autovettore e l'autovalore in questione. In questo caso il rapporto potrebbe essere $1$, che darebbe una situazione
  141. di non convergenza}.
  142. Introduciamo una definizione che ci permetterà di formalizzare meglio il problema.
  143. \begin{de}
  144. Una matrice $A$ si dice \emph{ciclica} se esiste un sottoinsieme dei suoi autovalori $J \subseteq \spe{A}$
  145. tale che $\forall \lambda,\mu \in J$ si ha che $|\lambda|=|\mu|$.
  146. \end{de}
  147. Per superare questa difficoltà si può, ancora una volta, modificare il modello. Consideriamo che il visitatore
  148. possa in ogni pagina, con probabilità $1-\gamma$, decidere di aprire una pagina a caso. Potremmo rappresentare
  149. questa nuova situazione sostituendo $M$ con la matrice
  150. \[
  151. A = \gamma M + (1-\gamma) \left[ \begin{array}{c}
  152. 1 \\
  153. \vdots \\
  154. 1
  155. \end{array} \right] \left[ 1 \: \hdots \: 1 \right]
  156. \]
  157. ovvero con una combinazione convessa della matrice $M$ con la matrice di soli $1$. Il valore di $\gamma$ si può
  158. scegliere a piacimento; Google usa un valore $\gamma = 0.85$. In questo caso la matrice $A$ non ha elementi nulli
  159. e quindi è irriducibile e non è ciclica\footnote{La condizione di ciclicità è quella che crea problemi
  160. con gli autovalori di modulo uguale al raggio spettrale}. Possiamo infine utilizzare un'ultima versione del Teorema~\ref{te:PerronFrobenius}
  161. che dice
  162. \begin{te}
  163. Sia $A$ una matrice con elementi strettamente positivi. Allora per ogni suo autovalore $\lambda \neq \rs{A}$ si ha
  164. che vale la diseguaglianza $|\lambda| < |\rs{A}|$.
  165. \end{te}
  166. Quest'ultimo ci assicura la convergenza del nostro metodo.
  167.  
  168. \subsection{Implementazione del metodo delle potenze}
  169. Presenteremo in questa sezione una versione del metodo delle potenze adattata alle nostre esigenze.
  170. Consideriamo la matrice $A$ di cui vogliamo trovare l'autovettore sinistro relativo all'autovalore $1$.
  171. Sappiamo che esiste la forma di Jordan di $A$ ed in particolare una matrice $S$ tale che
  172. \[
  173. S^{-1} A S = J \qquad J = \left[ \begin{array}{c|cc}
  174. 1 & \multicolumn{2}{|c}{\herm{0}} \\ \hline
  175. \multirow{2}{*}{$0$} & \sblocke{\hat J}{2} \\
  176. & &
  177. \end{array} \right]
  178. \]
  179. Osserviamo ora che $e_1$ è autovettore destro di $J$ ed anche autovettore sinistro. Entrambi sono relativi
  180. al'autovalore $1$. Sappiamo quindi che $e = Se_1$ è autovalore destro di $A$ e quindi è il vettore
  181. con tutte le componenti uguali ad $1$, mentre $\trasp{w} = \trasp{e_1}S^{-1}$ è autovettore sinistro di $A$,
  182. ovvero il vettore che stiamo cercando.
  183. In particolare quanto visto nella precedente sezione ci assicura che $\rs{\hat J} < 1$ e quindi possiamo osservare
  184. che
  185. \[
  186. \lim_{k\to\infty} J^{k} = e_1\trasp{e_1} \quad \text{e quindi} \quad \lim_{k\to\infty} A^{k} =
  187. \lim_{k\to\infty} SJ^kS^{-1} = Se_1 \trasp{e_1}S^{-1} = e\trasp{w}
  188. \]
  189. Questo (apparentemente) risolve il nostro problema in quanto $e\trasp{w}$ non è altro che la matrice le cui
  190. righe coincidono con il vettore $\trasp{w}$ che è precisamente quanto stiamo cercando. \\
  191. La complessità di questo calcolo non è però trascurabile, in quanto la moltiplicazione di una matrice
  192. costa in generale $O(n^3)$, decisamente troppo se $n \approx 10^{10}$ come nel nostro caso.
  193. \begin{os}
  194. Consideriamo dunque un vettore $x_0$ tale che $\trasp{e}x_0 = 1 = ||x_0||_{1}$, e definiamo la successione per ricorrenza
  195. \[
  196. \left\{ \begin{array}{ll}
  197. \trasp{x_0} & = \trasp{x_0} \\
  198. \trasp{x_{k+1}} & = \trasp{x_{k}} A
  199. \end{array} \right.
  200. \]
  201. Possiamo notare che in generale $x_k = x_0 A^{k}$ e quindi data la nostra scelta oculata di $x_0$ abbiamo
  202. che
  203. \[
  204. \lim_{k\to\infty} \trasp{x_k} = \lim_{k\to\infty} \trasp{x_0} A^{k} = x_0 e \trasp{w} = \trasp{w}
  205. \]
  206. In questo modo siamo scesi da una complessità $O(n^3)$ ad una $O(n^2)$.
  207. \end{os}
  208. Sfortunatamente $O(n^2)$ nel nostro caso continua ad essere un numero troppo grande; arrivati a questo
  209. punto ci possiamo rendere conto che possiamo sfruttare la particolarità di $A$, che non è assolutamente
  210. una matrice qualsiasi!
  211. %% TODO: QUalcosa di più sull'implementazione del metodo
  212.  
  213. \subsection{Note tecniche}
  214. Analizzato il problema matematicamente, sorge il bisogno di analizzare le difficoltà di implementazione dovute
  215. all'hardware attualmente disponibile. Una matrice delle dimensioni di $A$ non è realmente memorizzabile
  216. elemento per elemento su nessun calcolatore, e non è pensabile nemmeno in alcun tipo di cluster. \\
  217. Un rapido conto mostra come, anche ipotizzando di usare dei tipi \verb-float- a 4 byte (in ogni
  218. caso presumibilmente troppo imprecisi) otteniamo uno spazio necessario di $N^2 \cdot 4$ byte, ovvero
  219. circa $10^{20}$ byte = $10^{11}$ GB di RAM, probabilmente un quantitativo superiore a quella di tutti i computer
  220. del mondo messi assieme\footnote{può darsi che nei prossimi anni quest'affermazione smetta di essere vera, ma
  221. non penso sia rilevante ai fini del problema}.
  222. Dobbiamo quindi adottare degli stratagemmi per gestire la memoria in modo efficiente.
  223.  
  224. Una prima osservazione è che la nostra matrice $A$ si può scrivere nel seguente modo
  225. \[
  226. A = \gamma D^{-1} \hat H + (1-\gamma) e\trasp{v}
  227. \]
  228. dove $\gamma$ e $w$ sono rispettivamente il parametro ed il vettore di personalizzazione. Per memorizzare
  229. $A$ possiamo quindi memorizzare $D$ ed $\hat H$, $\gamma$ e $w$. \\
  230. Questo ci dà dei vantaggi perché la matrice $\hat H$ è ``quasi nulla'' nel senso che è fatta solamente di $0$ ed $1$,
  231. ma la percentuale di $0$ è molto alta\footnote{è infatti presumibile che il numero di link uscenti da una pagina
  232. sia trascurabile rispetto al numero di pagine esistenti}. Possiamo quindi limitarci a memorizzare i seguenti dati: \\[5pt]
  233. \begin{tabular}{|lll|} \hline
  234. \textbf{Variabile} & \textbf{Descrizione} & \textbf{Spazio occupato} \\ \hline \hline
  235. $N$ & l'ordine della matrice $A$, ovvero il numero di pagine esistenti & 4 byte \\
  236. $m$ & il numero di campi di $\hat H$ diversi da $0$ & \textasciitilde $N$ byte \\
  237. $i, j$ & vettori delle coordinate dei campi diversi da $0$ di $\hat H$ & \textasciitilde $N$ byte \\
  238. $\gamma$ & coefficiente di personalizzazione & 4 byte \\
  239. $w$ & Vettore di personalizzazione & \textasciitilde $N$ byte \\
  240. $d$ & il vettore con gli elementi diagonali di $D$ & \textasciitilde $N$ byte \\
  241. \hline \end{tabular} \\
  242.  
  243. Possiamo ora porci il problema di calcolare $d$. Questo è reso apparentemente più complicato dal modo in cui abbiamo salvato
  244. la matrice. In realtà possiamo usare un algoritmo di questo tipo
  245.  
  246. \begin{lstlisting}[frame=tb,caption=Calcolo di $d$,label=lst:calcolovettorepers]{}
  247. ! Inizializziamo il vettore d a 0
  248. d = 0;
  249. ! Questo ciclo calcola i link uscenti da i per ogni i
  250. DO k=1,m
  251. d(i(k)) = d(i(k)) + 1
  252. END DO
  253. \end{lstlisting}
  254.