java pagerank_PageRank的java实现

本文介绍了PageRank的计算公式,并提供了使用Java实现PageRank算法的详细代码。在给定的网络中,通过迭代更新每个节点的PageRank值,直至达到预设的收敛距离阈值。代码包括了主程序及节点类的定义,展示了如何构建和处理图结构。
摘要由CSDN通过智能技术生成

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

803ca5c0553ef8ecd76d082b84d4deff.png

PR(u)表示节点u的PageRank值,d为衰减因子(damping factor)或阻尼系数,一般取d=0.85,N为网络中的节点总数,nb(u)表示节点u的所有邻居节点的集合,d(v)表示节点v的出度(如果是无向图,就是度),w(u,v)表示节点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的数学原理的详细说明,可参考:

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

f2bd697e630278c22fe3664c0a98a32d.png

bd13d0e2e2c102300020aa081b60d2d1.png

Java实现代码:

Program.java:

1 packagedd.lt;2

3 importdd.lt.entity.Node;4

5 public classProgram6 {7 //计算每个节点的PageRank值

8 public static void CalcPageRank(ArrayListgraph)9 {10 double distance = 0.00001;11 double d = 0.85;//damping factor

12 double common = (1 - d) /graph.size();13 while (true)14 {15 for(Node n : graph)16 {17 double sum = 0.0;18 for (intnodeId : n.getNeighbors())19 {20 Node nb =getNodeById(nodeId,graph);21 sum += nb.getPR() /nb.getDegree();22 }23 double newPR = common + d *sum;24 //如果尚未收敛,赋新值,否则结束迭代

25 if (Math.abs(n.getPR() - newPR) >distance)26 n.setPR(newPR);27 else

28 return;29 }30 }31 }32

33 public static Node getNodeById(int nodeId,ArrayListgraph)34 {35 for(Node n:graph)36 {37 if (n.nodeId==nodeId)38 returnn;39 }40 return null;41 }42

43

44 public static ArrayListbuildGraph()45 {46 ArrayList graph = new ArrayList();//图以节点集合形式来表示47 //加载数据,组装好图结构

48 ....49 returngraph;50 }51

52 public static voidmain(String[] args)53 {54 ArrayList graph =buildGraph();55 CalcPageRank(graph);56 for(Node n:graph)57 {58 System.out.println("PageRank of %d is %.2f",n.nodeId,n.getPR());59 }60 }61 }

Node.java:

1 packagedd.lt.entity;2

3 importjava.util.ArrayList;4

5 public class Node implements Comparable

6 {7 public intnodeId;8 private ArrayList neighbors = new ArrayList();//以邻接表的形式表示图结构【无向图】

9 private double pr=1; //每个节点的初始PageRank值设为110 public Node(int nodeId)11 {12 this.nodeId =nodeId;13 }14

15 public intgetDegree()16 {17 return this.neighbors.size();18 }19

20 public ArrayListgetNeighbors()21 {22 return this.neighbors;23 }24 public void setNeighbors(ArrayListneighbors)25 {26 this.neighbors=neighbors;27 }28

29 public doublegetPR()30 {31 returnpr;32 }33 public void setPR(doubleval)34 {35 this.pr=val;36 }37

38 //按PageRank值排序

39 public intcompareTo(Node anotherNode)40 {41 if (this.neighbors != null && anotherNode.neighbors != null)42 {43 //降序排列

44 if (anotherNode.getPR() >this.getPR())45 return 1;46 else if (anotherNode.getPR()

49 return 0;50 //升序排列51 //return this.getPR()-anotherNode.getPR();

52 }53 return 0;54 }55 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值