PageRank里面的边是没有权重的,就是说每一个点对另一个点的影响都是一样的,但是会有一些情况,一个点对另一个点的影响大小不一致,这就需 要用到了给边加权重的方法,这就有了Weighted PageRank这个算法。WPR算法的理论资料相对于PR算法会少很多的,可以在Google scholar 上找到这篇论文 Weighted PageRank Algorithm . ,还可以到一些学校的网站找到这个算法的讲解,就差不多了。
我的实现方法是,先构建一个没有权重的关系矩阵,然后根据已经获得的矩阵,和WPR的权重出度和入读的方法计算出权重矩阵,然后有WPR的算法实现。实现的只是一个简单的实例,具体到实际的数据时还需要做修改。
代码如下:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class WeightPageRank {
private static int count; //矩阵的维数
static int[][] matrix; //二维数组,构造关系矩阵
static double[][] weightMatrix; //二维数组,边的权重矩阵
static double[] outLinks; //每个点的出链接数
static double[] inLinks; //每个点的入链接数
static double[] pageRank; //PageRank值
static double d = 0.85; //抑制因素,设为0.85
boolean flag = true; //控制循环,收敛后则为false,停止计算
/**
* 构造函数
* @param count //矩阵的维数
*/
public WeightPageRank(int count)
{
this.count = count;
pageRank = new double[count];
for(int i = 0; i < count; i++)
pageRank[i] = 1/count; //将每个页面的初始PR值设为1
}
/**
* 初始化矩阵
* @throws IOException
*/
public void InitialMatrix() throws IOException
{
matrix = new int[count][count]; //关系矩阵
File file = new File("graph.txt"); //读取文件中的关系信息
FileReader fr;
BufferedReader br;
if(file.exists()) //文件存在
{
fr = new FileR