PageRank算法的JAVA代码实现

                               PageRank算法的JAVA代码实现

  前天峰哥突然给了一个任务,要我们一周之内搞定PageRank的算法,当时乍的一听觉得有点高大上,这两天查了点资料加上小半个通宵,终于还是给搞出来了。

  搞PageRank算法首先就要了解这个算法的核心算法,这个以佩奇名字命名的算法,核心算法是这样的:

PR(A) = (1-d) + d (PR(T1)/C(T1) + ... + PR(Tn)/C(Tn)) 
其中:PR(A):页面A的网页级别
PR(Ti):页面Ti的网页级别,页面Ti链向页面A, 
C(Ti):页面Ti链出的链接数量,
d:阻尼系数,取值在01之间.

从上我们可以看出想要实现这个算法不难,只要通过迭代就能实现,暂且先不说这个算法的原理是什么,先附上我的源码。

public class PageRank_My {
 
public static void main(String[] args) {
// 定义阻尼系数
double damp = 0.85;
 
/* 测试数据,表示四个网页相互之间的有向链接矩阵
 * 用矩阵形式表示
 *    A  B  C  D
 * A  0  1  1  0
 * B  0  0  1  0
 * C  1  1  0  0
 * D  0  1  1  0
 * */
 
int[][] link = {
{ 0, 1, 1, 0 }, 
{ 0, 0, 1, 0 }, 
{ 1, 1, 0, 0 },
{ 0, 1, 1, 0 }
 
};
// 各点的总链出数量
int[] linkOut = new int[link.length];
for (int i = 0; i < link.length; i++) {
for (int j = 0; j < link.length; j++) {
linkOut[i] += link[i][j];
}
}
//定义一个初始数组并初始化,设所有的页面初始PR值都为1;
double[] pr = new double[link.length];
 
double[] init = new double[link.length];
for (int i = 0; i < link.length; i++) {
init[i] = 1.0;
 
}
pr = pagerank(link, damp, linkOut, init);
 
//我们进行10次迭代计算pagerank的值
for(int i=0;i<10;i++){
System.arraycopy(pr, 0, init, 0, link.length);
pr = pagerank(link, damp, linkOut, pr);
}
 
for (int i = 0; i < link.length; i++) {
System.out.println("PR(" + i + ") = " + pr[i]);
}
 
}
/*计算pagerank的函数
 * @param link 页面的链接图
 * @param damp 设置的阻尼系数,佩奇设的是0.85
 * @param linkout 每个页面的链接总数
 * @param init 上次迭代的结果
 * 
 * */
public static double[] pagerank(int[][] link, double damp, int[] linkout,
double[] init) {
 
double[] pr = new double[init.length];
double num = 0;
for (int i = 0; i < init.length; i++) {
for (int j = 0; j < init.length; j++) {
// 接下来的判断是关键,计算非本页面,和链接数不为0的页面,并且那个页面有连到本页面的值,即是links[j][i] !=0。
if ((i != j) && (linkout[j] != 0) && (link[j][i] != 0))
num = num + init[j] / linkout[j];
 
}
// pagerank的计算公式
pr[i] = damp + (1 - damp) * num;
}
return pr;
}
}

 

 

 

  通过注释不难理解这个算法的过程,算法的原理我之后再详细道来。

 

 

猜你喜欢

转载自linhaoxiang.iteye.com/blog/2038523