import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class PageRank {
public int[][] data;
public void loaddata() throws IOException{//函数作用:载入数据
BufferedReader br=new BufferedReader(new FileReader("F:/数据挖掘--算法实现/pagerank算法/input.txt"));
String line="";
List<String> content=new ArrayList<String>();
int count=-1;
while((line=br.readLine())!=null){
if(count==-1){count=0;continue;}
content.add(line);
count++;
}
data=new int[count][count];
Iterator<String> Iter=content.iterator();
while(Iter.hasNext()){
String tmp=Iter.next();
int index_i=Integer.parseInt(tmp.split(" ")[0]);
String[] content_i=tmp.split(" ",2)[1].trim().split(",");
for(int j=0;j<content_i.length;j++){
this.data[Integer.parseInt(content_i[j])-1][index_i-1]=1;
}
}
}
public float[][] P_compute(int[][] data){//函数作用:根据网站链接矩阵,计算状态转移矩阵
float[][] P=new float[data.length][data[0].length];
for(int j=0;j<data[0].length;j++){
int count_i=0;
for(int i=0;i<data.length;i++){
count_i=count_i+data[i][j];
}
for(int i=0;i<data.length;i++){
P[i][j]=((float)data[i][j])/count_i;
}
}
return P;
}
public float[] P_R(float[][] P,float[] R){//函数作用:两个矩阵相乘
float[] B=new float[R.length];
for(int i=0;i<R.length;i++){
B[i]=0;
for(int j=0;j<P[i].length;j++){
B[i]=B[i]+P[i][j]*R[j];
}
}
return B;
}
public float[] MN_plu(float[] M,float[] N){//函数作用:两个矩阵相加
float[] MN=new float[M.length];
for(int i=0;i<M.length;i++){
MN[i]=M[i]+N[i];
}
return MN;
}
public float[] qM(float q,float[] M){//函数作用:一个常数乘以矩阵M
float[] tmp=new float[M.length];
for(int i=0;i<M.length;i++){
tmp[i]=q*M[i];
}
return tmp;
}
public float R_R1(float[] R,float[] R1){//函数作用:计算矩阵R-R1的二范数
float tmp=0;
for(int i=0;i<R.length;i++){
tmp=tmp+(R[i]-R1[i])*(R[i]-R1[i]);
}
return (float)Math.sqrt(tmp);
}
public static void main(String[] args) throws IOException {
PageRank a=new PageRank();
a.loaddata();
float[][] P=a.P_compute(a.data);
float[] R=P[0];
float[] R1=R;
float q=0.85f;
float[] q_N=new float[P.length];
for(int i=0;i<P.length;i++){
q_N[i]=(1-q)/R.length;
}
while(1==1){
R1=a.MN_plu(q_N,a.qM(q,a.P_R(P,R)));//公式Rank=(1-q)/N + P*Rank
if(a.R_R1(R,R1)<0.0001){break;}
R=R1;
}
for(int i=0;i<R.length;i++){
System.out.println("第"+(i+1)+"个网站得分:"+R[i]+"; ");
}
}
}
取q=0.85
输入数据:
链接源ID 链接目标 ID
1 2,3,4,5,7
2 1
3 1,2
4 2,3,5
5 1,3,4,6
6 1,5
7 5
输出数据:
第1个网站得分:0.28069958;
第2个网站得分:0.15898989;
第3个网站得分:0.13907255;
第4个网站得分:0.108362645;
第5个网站得分:0.18444087;
第6个网站得分:0.060631357;
第7个网站得分:0.06915985;