一个网络(有向带权图)中节点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. python获取父类的子类(遍历,递归),并循环执行所有子类的某一方法

    前言 换了新工作,踏足于python语言的开发,也把自己的学习过程记录下来. 一,递归获取某一父类的所有子类 all_subclasses = {'0': '0'} def get_all_class ...

  2. poj题目

    poj2965 poj1753:标准的BFS+位运算优化 poj1328:线段覆盖变种,把圆对应到线段上,贪心求解 poj2109:高精度开根,二分+高精度,注意要判断答案的位数,如果按照题目给的范围 ...

  3. 记一周cdqz训练

    #include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs.com/w ...

  4. iOS面试必看

    转载:http://www.jianshu.com/p/5d2163640e26 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形 ...

  5. 【bzoj1415】 Noi2005—聪聪和可可

    http://www.lydsy.com/JudgeOnline/problem.php?id=1415 (题目链接) 题意 一张图,聪聪想吃可可.每单位时间聪聪可以先移动两次:可可后移动一次或停在原 ...

  6. 终端指令操作创建Django项目

    需求:通过Django创建一个用户表和权限表. 用户表包括:用户名,邮箱,密码,管理权限. 权限表包括:普通用户,管理用户,超级用户. 权限表和用户表有一对多的关系,即用户表中的每条数据对应权限表中的 ...

  7. Beta阶段项目终审报告

    先上图 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件主要是用来解决玩狼人杀这款桌游时无牌.无法官.游戏流程不熟悉等情况的.我觉得我们对典型 ...

  8. 数据结构作业——Sanji(优先队列)

    山治的婚约 Description 我们知道,山治原来是地下有名的杀人家族文斯莫克家族的三子,目前山治的弟弟已经出现,叫做四治,大哥二哥就叫汪(One)治跟突(Two)治好了(跟本剧情无关) .山治知 ...

  9. CSS的常见属性

    1. css是cascading style sheet 层叠式样式表的简写."层叠式"的意思,我们将慢慢的去理解. 1                <style type ...

  10. supermpa配置遇到的问题

    环境 vs2010  supermap idesktop7.1.2  iobject7.1.2.net windowform 问题 在安装iobject7.1.2 64位时 在vs中的工具箱是不显示s ...