Advertisement
Guest User

PageRank.java

a guest
May 27th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.74 KB | None | 0 0
  1. import java.util.Arrays;
  2. import java.util.Comparator;
  3.  
  4. public class PageRank {
  5.  
  6.     /**
  7.      * Diese Methode erstellt die Matrix A~ fuer das PageRank-Verfahren
  8.      * PARAMETER:
  9.      * L: die Linkmatrix (s. Aufgabenblatt)
  10.      * rho: Wahrscheinlichkeit, anstatt einem Link zu folgen,
  11.      *      zufaellig irgendeine Seite zu besuchen
  12.      */
  13.     public static double[][] buildProbabilityMatrix(int[][] L, double rho) {
  14.         //wir gehen davon aus, dass jede Seite bereits auf sich selbst verweist.
  15.         double[][] A = new double[L.length][L.length];
  16.         for(int i=0; i<L.length; i++){
  17.             int linkCount = 0;
  18.             for(int j=0; j<L.length; j++){
  19.                 linkCount+=L[i][j];
  20.             }
  21.             for(int j=0; j<L.length; j++){
  22.                 A[i][j]=(1.0d-rho)*L[i][j]/linkCount+rho/L.length;
  23.             }
  24.         }
  25.         return A;
  26.     }
  27.  
  28.     /**
  29.      * Diese Methode berechnet die PageRanks der einzelnen Seiten,
  30.      * also das Gleichgewicht der Aufenthaltswahrscheinlichkeiten.
  31.      * (Entspricht dem p-Strich aus der Angabe)
  32.      * Die Ausgabe muss dazu noch normiert sein.
  33.      * PARAMETER:
  34.      * L: die Linkmatrix (s. Aufgabenblatt)
  35.      * rho: Wahrscheinlichkeit, zufaellig irgendeine Seite zu besuchen
  36.      * ,anstatt einem Link zu folgen.
  37.      *      
  38.      */
  39.     public static double[] rank(int[][] L, double rho) {
  40.         double[][]A = buildProbabilityMatrix(L, rho);
  41.         //A~ - I
  42.         for(int i=0; i<A.length; i++){
  43.             A[i][i] -= 1.0d;
  44.         }
  45.         double[] G = Gauss.solveSing(A);
  46.         double norm = 0;
  47.         for(int i=0; i<G.length; i++){
  48.             norm += G[i]*G[i];
  49.         }
  50.         norm = Math.sqrt(norm);
  51.         for(int i=0; i<G.length; i++){
  52.             G[i] /= norm;
  53.         }
  54.         return G;
  55.     }
  56.  
  57.     /**
  58.      * Diese Methode erstellt eine Rangliste der uebergebenen URLs nach
  59.      * absteigendem PageRank.
  60.      * PARAMETER:
  61.      * urls: Die URLs der betrachteten Seiten
  62.      * L: die Linkmatrix (s. Aufgabenblatt)
  63.      * rho: Wahrscheinlichkeit, anstatt einem Link zu folgen,
  64.      *      zufaellig irgendeine Seite zu besuchen
  65.      */
  66.     public static String[] getSortedURLs(String[] urls, int[][] L, double rho) {
  67.         int n = L.length;
  68.  
  69.         double[] p = rank(L, rho);
  70.  
  71.         RankPair[] sortedPairs = new RankPair[n];
  72.         for (int i = 0; i < n; i++) {
  73.             sortedPairs[i] = new RankPair(urls[i], p[i]);
  74.         }
  75.  
  76.         Arrays.sort(sortedPairs, new Comparator<RankPair>() {
  77.  
  78.             @Override
  79.             public int compare(RankPair o1, RankPair o2) {
  80.                 return -Double.compare(o1.pr, o2.pr);
  81.             }
  82.         });
  83.  
  84.         String[] sortedUrls = new String[n];
  85.         for (int i = 0; i < n; i++) {
  86.             sortedUrls[i] = sortedPairs[i].url;
  87.         }
  88.  
  89.         return sortedUrls;
  90.     }
  91.  
  92.     /**
  93.      * Ein RankPair besteht aus einer URL und dem zugehoerigen Rang, und dient
  94.      * als Hilfsklasse zum Sortieren der Urls
  95.      */
  96.     private static class RankPair {
  97.         public String url;
  98.         public double pr;
  99.  
  100.         public RankPair(String u, double p) {
  101.             url = u;
  102.             pr = p;
  103.         }
  104.     }
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement