一个网络(有向带权图)中节点u的PageRank的计算公式:

PR(u)表示节点u的PageRank值,d为衰减因子(damping factor)或阻尼系数,一般取d=0.85,N为网络中的节点总数,nb(u)表示节点u的所有邻居节点的集合,d(v)表示节点v的出度(如果是无向图,就是度),w(u,v)表示节点v的边<u,v>所占的权重(如果对于无权图或者认为每条边的权重都一样,那么w(u,v)=1),PR(v)表示节点v的PageRank值。

由此可以看出要算出节点u的PR值需要先知道它的每个邻居节点的PR值,似乎是个递归的过程。其实初始状态下,可以给每个节点的PR值都赋值为一个任意正数,例如1,然后通过上述公式不断迭代计算更新每个节点的PR值,数学证明,最终每个节点的PR值都会收敛到一个稳定的PR值(初值PR不同,最终的PR值也不同,但最后各节点之间PR的大小排名不因初值而改变)。编程时如何确定某个节点u的PR值已经收敛?如果这次的PR值与上次的PR值相差很小的时候就可以认为收敛了。很小是多小?越小越好,但不要太小,免得迭代次数太多浪费时间,可取10的-4或-5次方。

PageRank的数学原理的详细说明,可参考:

深入浅出PageRank算法

PageRank on undirected and weighted graph

《集体智慧编程》上的例子:

Java实现代码:

Program.java:

 package dd.lt;

 import dd.lt.entity.Node;

 public class Program
{
//计算每个节点的PageRank值
public static void CalcPageRank(ArrayList<Node> graph)
{
double distance = 0.00001;
double d = 0.85;// damping factor
double common = (1 - d) / graph.size();
while (true)
{
for (Node n : graph)
{
double sum = 0.0;
for (int nodeId : n.getNeighbors())
{
Node nb = getNodeById(nodeId,graph);
sum += nb.getPR() / nb.getDegree();
}
double newPR = common + d * sum;
//如果尚未收敛,赋新值,否则结束迭代
if (Math.abs(n.getPR() - newPR) > distance)
n.setPR(newPR);
else
return;
}
}
} public static Node getNodeById(int nodeId,ArrayList<Node> graph)
{
for(Node n:graph)
{
if (n.nodeId==nodeId)
return n;
}
return null;
} public static ArrayList<Node> buildGraph()
{
ArrayList<Node> graph = new ArrayList<Node>();//图以节点集合形式来表示
//加载数据,组装好图结构
....
return graph;
} public static void main(String[] args)
{
ArrayList<Node> graph = buildGraph();
CalcPageRank(graph);
for(Node n:graph)
{
System.out.println("PageRank of %d is %.2f",n.nodeId,n.getPR());
}
}
}

Node.java:

 package dd.lt.entity;

 import java.util.ArrayList;

 public class Node implements Comparable<Node>
{
public int nodeId;
private ArrayList<Integer> neighbors = new ArrayList<Integer>();//邻接表的形式表示图结构
private double pr=1;
public Node(int nodeId)
{
this.nodeId = nodeId;
} public int getDegree()
{
return this.neighbors.size();
} public ArrayList<Integer> getNeighbors()
{
return this.neighbors;
}
public void setNeighbors(ArrayList<Integer> neighbors)
{
this.neighbors=neighbors;
} public double getPR()
{
return pr;
}
public void setPR(double val)
{
this.pr=val;
} // 按PageRank值排序
public int compareTo(Node anotherNode)
{
if (this.neighbors != null && anotherNode.neighbors != null)
{
// 降序排列
if (anotherNode.getPR() >this.getPR())
return 1;
else if (anotherNode.getPR() <this.getPR())
return -1;
else
return 0;
// 升序排列
// return this.getPR()-anotherNode.getPR();
}
return 0;
}
}

PageRank的java实现的更多相关文章

  1. PageRank算法MapReduce实现

    如果你现在需要计算网页的排名只有4一:数据如下面的: baidu 10.00 google,sina,nefu google 10.00 baidu sina 10.00 google nefu 10 ...

  2. PageRank在Hadoop和spark下的实现以及对比

    关于PageRank的地位,不必多说. 主要思想:对于每个网页,用户都有可能点击网页上的某个链接,例如 A:B,C,D B:A,D C:AD:B,C 由这个我们可以得到网页的转移矩阵      A   ...

  3. mr实现pagerank

    PageRank计算什么是pagerankPageRank是Google专有的算法,用于衡量特定网页相对于搜索引擎索引中的其他网页而言的重要程度.是Google创始人拉里·佩奇和谢尔盖·布林于1997 ...

  4. 【Hadoop学习之十一】MapReduce案例分析三-PageRank

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 什么是pagerank?算法原理- ...

  5. 数据挖掘之权重计算(PageRank)

    刘  勇  Email:lyssym@sina.com 简介 鉴于在Web抓取服务和文本挖掘之句子向量中对权重值的计算需要,本文基于MapReduce计算模型实现了PageRank算法.为验证本文算法 ...

  6. 20-hadoop-pagerank的计算

    转: http://www.cnblogs.com/rubinorth/p/5799848.html 参考尚学堂视频 1, 概念( 来自百度百科) PageRank是Google专有的算法,用于衡量特 ...

  7. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  8. pagerank

    http://jung.sourceforge.net/ https://github.com/louridas/pagerank/blob/aeb9b17ada1f925bb525961574f6d ...

  9. 如何用70行Java代码实现深度神经网络算法(转)

    对于现在流行的深度学习,保持学习精神是必要的——程序员尤其是架构师永远都要对核心技术和关键算法保持关注和敏感,必要时要动手写一写掌握下来,先不用关心什么时候用到——用不用是政治问题,会不会写是技术问题 ...

随机推荐

  1. NPOI操作EXCEL(二)——大量不同模板时设计方式

    上一篇文章介绍了一些NPOI的基础接口,我们现在就来看看具体怎么用NPOI来解析一个EXCEL. 博主现在有这么一堆excel需要解析数据入库: 当然这只是员工的简要模板,还有很多其他的模板.我们可以 ...

  2. SQLite源程序分析之回叫机制

    1.SQL访问数据库非常方便,只需简单的三个函数: sqlite3_open(char* szDbFileName, sqlite3 ** db) sqlite3_exec(sqlite3 *db, ...

  3. 【C#】新建服务自动发送邮件

    ---windows服务,---自动发送邮件 邮件发送code #region 发送邮件函数 public void SendMailUseZj() { System.Net.Mail.MailMes ...

  4. Equal Sides Of An Array

    参考:http://stackoverflow.com/questions/34584416/nested-loops-with-arrays You are going to be given an ...

  5. js获取可视区域高度

    document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.docume ...

  6. c++中的lambda特性

    来源: http://www.jb51.net/article/56147.htm cocos2dx3.0测试: 1.有参数a,b printf("lambda=%lf", []( ...

  7. 精通Web Analytics 2.0 (10) 第八章:竞争情报分析

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第八章:竞争情报分析 在现实世界中,收集竞争情报可能意味着雇人在竞争对手的垃圾桶(实际会发生!)翻找. 在虚拟世界中,堆如山的数 ...

  8. 企业站SEO记录

    半个多月前给接了一个企业站,赚点小钱,客户也没什么要求,所以就找了模板修改了一下就上线了,然后又做了微信网站.搭了微信公众号,也都没什么技术含量,最伤脑筋的就是做关键词排名了,虽然做的几个词竞争也不是 ...

  9. R 查看函数源代码

    1:输入函数名. 2:methods( ),例如methods(quantile). 3:针对方法2得到的带*的,例stats:::quantile.default.

  10. 给zabbix穿一件漂亮的衣服

    推荐给zabbix穿上一件漂亮的衣服,安装Grafana推荐连接:http://www.myexception.cn/software-testing/2008870.html yum install ...