PageRank的java实现
一个网络(有向带权图)中节点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 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实现的更多相关文章
- PageRank算法MapReduce实现
如果你现在需要计算网页的排名只有4一:数据如下面的: baidu 10.00 google,sina,nefu google 10.00 baidu sina 10.00 google nefu 10 ...
- PageRank在Hadoop和spark下的实现以及对比
关于PageRank的地位,不必多说. 主要思想:对于每个网页,用户都有可能点击网页上的某个链接,例如 A:B,C,D B:A,D C:AD:B,C 由这个我们可以得到网页的转移矩阵 A ...
- mr实现pagerank
PageRank计算什么是pagerankPageRank是Google专有的算法,用于衡量特定网页相对于搜索引擎索引中的其他网页而言的重要程度.是Google创始人拉里·佩奇和谢尔盖·布林于1997 ...
- 【Hadoop学习之十一】MapReduce案例分析三-PageRank
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 什么是pagerank?算法原理- ...
- 数据挖掘之权重计算(PageRank)
刘 勇 Email:lyssym@sina.com 简介 鉴于在Web抓取服务和文本挖掘之句子向量中对权重值的计算需要,本文基于MapReduce计算模型实现了PageRank算法.为验证本文算法 ...
- 20-hadoop-pagerank的计算
转: http://www.cnblogs.com/rubinorth/p/5799848.html 参考尚学堂视频 1, 概念( 来自百度百科) PageRank是Google专有的算法,用于衡量特 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- pagerank
http://jung.sourceforge.net/ https://github.com/louridas/pagerank/blob/aeb9b17ada1f925bb525961574f6d ...
- 如何用70行Java代码实现深度神经网络算法(转)
对于现在流行的深度学习,保持学习精神是必要的——程序员尤其是架构师永远都要对核心技术和关键算法保持关注和敏感,必要时要动手写一写掌握下来,先不用关心什么时候用到——用不用是政治问题,会不会写是技术问题 ...
随机推荐
- 数据集偏斜 - class skew problem - 以SVM松弛变量为例
原文 接下来要说的东西其实不是松弛变量本身,但由于是为了使用松弛变量才引入的,因此放在这里也算合适,那就是惩罚因子C.回头看一眼引入了松弛变量以后的优化问题: 注意其中C的位置,也可以回想一下C所起的 ...
- weui 搜索框
点击搜索,会显示关键字取消按钮,输入文字,会在搜索框下,有相应的列表显示. HTML: <!DOCTYPE html> <html> <head> <meta ...
- bzoj4196
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1376 Solved: 785[Submit][Stat ...
- 一次kibana服务失败的排查过程
公司在kubernetes集群上稳定运行数月的kibana服务于昨天下午突然无法正常提供服务,访问kibana地址后提示如下信息: 排查过程: 看到提示后,第一反应肯定是检查elasticsearch ...
- Java防止SQL注入2(通过filter过滤器功能进行拦截)
首先说明一点,这个过滤器拦截其实是不靠谱的,比如说我的一篇文章是介绍sql注入的,或者评论的内容是有关sql的,那会过滤掉:且如果每个页面都经过这个过滤器,那么效率也是非常低的. 如果是要SQL注入拦 ...
- 人脸识别引擎SeetaFace编译 ubuntu
00.SeetaFace简介 SeetaFace Engine is an open source C++ face recognition engine, which can run on CPU ...
- TypeScript 素描-变量声明
博文读自 TypeScript 官方文档而来,不具有学习性,仅是本人学习时记录以供日后翻阅 ,有学习TypeScript的朋友还请去看更为详细的官方文档 /* 变量声明在之前的js中一直是使用var关 ...
- bzoj2330: [SCOI2011]糖果
2330: [SCOI2011]糖果 Time Limit: 10 Sec Memory Limit: 128 MB Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友 ...
- TomCat的安装与配置方法
经过自己的研究,各种烦,所以要写个博客,帮助大家安装这个软件. 一.安装TomCat(因为大家都安装了jdk,所以就不写了) 1.下载TomCat 网址如下:http://tomcat.apache. ...
- 检测到有潜在危险的 Request.Form 值
这种问题是因为你提交的Form中有HTML字符串,例如你在TextBox中输入了html标签,或者在页面中使用了HtmlEditor组件等,解决办法是禁用validateRequest. 如果你是.n ...