数据挖掘--pagerank算法实现



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;  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值