一个网络(有向带权图)中节点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. [翻译] Android是怎样绘制视图的

    原文:How Android Draws Views 当一个Activity获取到焦点的时候,它的布局就开始被绘制. 绘制的过程由Android framework处理.但布局层级的根节点必须由Act ...

  2. ActiveMQ安全配置

    1.activeMQ管理后台用户名.密码的设置 管理后台地址http://localhost:8161/admin 默认用户名密码admin admin 端口默认是8161,且服务采用的是服务器,所以 ...

  3. cookie

    1.基本操作 Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给 ...

  4. js控制Bootstrap 模态框(Modal)插件

    js控制Bootstrap 模态框(Modal)插件 http://www.cnblogs.com/zzjeny/p/5564400.html

  5. Ajax操作如何实现跨域请求 (JSONP和CORS实现Ajax跨域的原理)

    由于浏览器存在同源策略机制,同源策略阻止ajax (XMLHttpRequest) 从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. 特别的:由于同源策略是浏览器的限制,所以请求的发送和响 ...

  6. vmware Centos6.6安装64位

    Centos6.6安装64位 必须开启BIOS中的虚拟化技术 首先开机进入BIOS,一般机器是按F2,我的T420是按F1,然后进入Security,Virtualization,选择Enable即可 ...

  7. Zabbix客户端安装

    CentOS 7 [root@localhost /]# rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-agent-3 ...

  8. 【JavaWeb】Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架(五)

    SpringSecurity(2) 好久没有写了,之前只写了一半,我是一边开发一边写Blog一边上班,所以真心没有那么多时间来维护Blog,项目已经开发到编写逻辑及页面部分了,框架基本上已经搭建好不会 ...

  9. HDU 1796How many integers can you find(容斥原理)

    How many integers can you find Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d ...

  10. pdo in 查询

    $ids1 = implode(",",$upload_ids);if(!empty($upload_ids)){ $ids_db= pdo_fetchall('select id ...