zoukankan      html  css  js  c++  java
  • python 实现PageRank计算

    #coding=utf-8
    # Filename:pr.py
    
    
    S=[[0,0,0,0],[0.3333,0,0,1],[0.3333,0.5,0,0],[0.3333,0.5,1,0]] #原始矩阵
    U=[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]  #全部都为1的矩阵
    f=[1,1,1,1]  #物征向量
    alpha=0.85  # a 值 0-1之间的小数
    n=len(S) #网页数
    
    
    '''
    aS a权重值 由google决定值大小,0-1之间,S为原始矩阵 
    '''
    def multiGeneMatrix(gene,Matrix):
        mullist=[[0]*len(Matrix) for row in range(len(Matrix))] #定义新的矩阵大小,初始化为0
        for i in range(0,len(Matrix)):
            for j in range(0,len(Matrix)):
                mullist[i][j] += Matrix[i][j]*gene
        return mullist 
    
    '''
    两个矩阵相加
    '''
    def addMatrix(Matrix1,Matrix2):
        if len(Matrix1[0])!=len(Matrix2):
            print "这两个矩阵无法相加..."
            return
    
        addlist=[[0]*len(Matrix1) for row in range(len(Matrix1))]    #定义新的矩阵大小
        for i in range(0,len(Matrix1)):
            for j in range(0,len(Matrix2)):
                addlist[i][j]=Matrix1[i][j]+Matrix2[i][j]
        return addlist
    '''
    矩阵与向量相乘
    '''
    def multiMatrixVector(m,v):
        rv=range(len(v))
    
        for row in range(0,len(m)):
            temp=0
            for col in range(0,len(m[1])):
                temp+=m[row][col]*v[col]
            rv[row]=temp
        return rv 
    
    #公式
    f1=multiGeneMatrix(alpha,S)
    f2=multiGeneMatrix((1-alpha)/len(S[0]),U)
    G=addMatrix(f1,f2)
    
    
    print G  #google矩阵
    
    
    #迭代过程
    count=0
    while(True):
        count=count +1
        pr_next=multiMatrixVector(G,f)
        print "第 %s 轮迭代" % count
        print str(round(pr_next[0],5)) +"\t" + str(round(pr_next[1],5)) + "\t" + str(round(pr_next[2],5)) + "\t" + str(round(pr_next[3],5))
        if round(f[0],5)==round(pr_next[0],5) and round(f[1],5)==round(pr_next[1],5) and round(f[2],5)==round(pr_next[2],5) and round(f[3],5)==round(pr_next[3],5):   #当前向量与上次向量值偏差不大后,停止迭
            break
        f=pr_next
    
    print "Page Rank值已计算完成"
    
    
    运行结果:
    第 1 轮迭代
    0.15    1.2833    0.8583    1.708312 轮迭代
    0.15    1.64455    0.7379    1.467463 轮迭代
    0.15    1.43983    0.89143    1.518644 轮迭代
    0.15    1.48333    0.80442    1.562135 轮迭代
    0.15    1.5203    0.82291    1.506666 轮迭代
    0.14999    1.47315    0.83862    1.538097 轮迭代
    0.14999    1.49986    0.81858    1.53148 轮迭代
    0.14999    1.49418    0.82993    1.525729 轮迭代
    0.14999    1.48935    0.82751    1.5329510 轮迭代
    0.14999    1.4955    0.82546    1.5288511 轮迭代
    0.14999    1.49201    0.82807    1.5297112 轮迭代
    0.14999    1.49274    0.82659    1.5304513 轮迭代
    0.14999    1.49337    0.8269    1.529514 轮迭代
    0.14999    1.49256    0.82717    1.5300315 轮迭代
    0.14999    1.49301    0.82682    1.5299116 轮迭代
    0.14999    1.49291    0.82701    1.5298117 轮迭代
    0.14999    1.49282    0.82697    1.5299318 轮迭代
    0.14999    1.49292    0.82693    1.5298619 轮迭代
    0.14999    1.49286    0.82697    1.5298720 轮迭代
    0.14999    1.49287    0.82695    1.5298721 轮迭代
    0.14999    1.49287    0.82695    1.5298522 轮迭代
    0.14999    1.49285    0.82695    1.5298623 轮迭代
    0.14999    1.49286    0.82694    1.5298524 轮迭代
    0.14999    1.49285    0.82694    1.5298425 轮迭代
    0.14999    1.49284    0.82694    1.5298426 轮迭代
    0.14999    1.49284    0.82694    1.5298327 轮迭代
    0.14998    1.49284    0.82693    1.5298328 轮迭代
    0.14998    1.49283    0.82693    1.5298229 轮迭代
    0.14998    1.49283    0.82693    1.52982
    Page Rank值已计算完成
    
    
    
    
    #coding=utf-8
    # FileName:MapReducePageRank.py
    
    '''
    模拟map-reduce的思想,实现AB物理节点的分布计算。
    '''
    
    #矩阵与乘因子
    def multiGeneMatrix(gene,Matrix):
        result=[[0]*len(Matrix[0]) for row in range(len(Matrix[0]))] #定义大小一样新的矩阵,初始化为0
        for i in range(0,len(Matrix[0])):
            for j in range(0,len(Matrix[0])):
                    result[i][j]=Matrix[i][j]*gene
        return result
    
    #两个矩阵相加
    def addMatrix(Matrix1,Matrix2):
        if len(Matrix1[0])!=len(Matrix2[1]):
            print "这两个矩阵无法相加..."
            return
        addList=[[0]*len(Matrix1[0]) for row in range(len(Matrix1[0]))]
        for i in range(0,len(Matrix1[0])):
            for j in range(0,len(Matrix2[0])):
                addList[i][j]=Matrix1[i][j]+Matrix2[i][j]
        return addList
    
    #两个矩阵合并
    def addColumnMatrix(Matrix1,Matrix2):
        result=Matrix1+Matrix2
        return result
    
    #矩阵与向量相乘
    def multiMatrixVector(m,v):
        rv = range(len(m))
        
        for row in range(0,len(m)):
            temp=0
            for col in range(0,len(m[1])):
                temp +=m[row][col]*v[col]
            rv[row]=temp
        return rv
    
    '''
    按照map-reduce的思想,现在假设有物理节点A,B参与计算,其中网页1、2保存于A,网页3、4保存于B,试述完整的pagerank计算过程 
    '''
    
    alpha=0.85 #定义google 权重值
    aS=[[0,0],[0.3333,0],[0.3333,0.5],[0.3333,0.5]] #假设A节点存放 page1 page2网页 原始矩阵
    bS=[[0,0],[0,1],[0,0],[1,0]]  #假设B节点存放 page3 page4 网页 原始矩阵
    U=[[1,1],[1,1],[1,1],[1,1]]   #全部为1的矩阵
    n=len(aS)   #得到网页个数
    
    #计算A节点的G 矩阵
    fa1=multiGeneMatrix(alpha,aS)  #google权重值 与 原始矩阵
    fa2=multiGeneMatrix((1-alpha)/n,U) #(1-a)/n*U
    aG=addMatrix(fa1,fa2) #aS+(1-a)/n*U
    
    #计算B节点的G 矩阵
    fb1=multiGeneMatrix(alpha,bS)
    fb2=multiGeneMatrix((1-alpha)/n,U)
    bG=addMatrix(fb1,fb2)
    
    #AB节点特征向量
    qa_cur=[1,1]
    qb_cur=[1,1]
    
    count=1
    
    while(True):
        count = count +1
        #得到A节点qG
        #print aG
        #print qa_cur
        qa_next=multiMatrixVector(aG,qa_cur);
        #得到B节点qG
        qb_next=multiMatrixVector(bG,qb_cur);
        #合并两个矩阵
        qab_next=addColumnMatrix(qa_next,qb_next);
        
        #小数位缩小到5位
        qa_cur[0]=round(qa_cur[0],5)
        qa_cur[1]=round(qa_cur[1],5)
        qb_cur[0]=round(qb_cur[0],5)
        qb_cur[1]=round(qb_cur[1],5)
    
        qab_next[0]=round(qab_next[0],5)
        qab_next[1]=round(qab_next[1],5)
        qab_next[2]=round(qab_next[2],5)
        qab_next[3]=round(qab_next[3],5)
    
        #判断是否收敛到十分接近
        if qa_cur[0]==qab_next[0] and qa_cur[1]==qab_next[1] and qb_cur[0]==qab_next[2] and qb_cur[1]==qab_next[3]:
            break
    
        qa_cur[0]=qab_next[0]
        qa_cur[1]=qab_next[1]
        qb_cur[0]=qab_next[2]
        qb_cur[1]=qab_next[3]
    
        sum=qa_cur[0]+qa_cur[1]+qb_cur[0]+qb_cur[1]
        print "P1=" + str(qa_cur[0]/sum)
        print "P2=" + str(qa_cur[1]/sum)
        print "P3=" + str(qb_cur[0]/sum)
        print "P4=" + str(qb_cur[1]/sum)
        print "第 %s 轮迭代。" % count
    
    运行结果:
    
    P1=0.0523267982976
    P2=0.249982557734
    P3=0.0523267982976
    P4=0.6453638456712 轮迭代。
    P1=0.0177595628415
    P2=0.0409836065574
    P3=0.0409836065574
    P4=0.9002732240443 轮迭代。
    P1=0.00261177626645
    P2=0.0085593855861
    P3=0.0417625610923
    P4=0.9470662770554 轮迭代。
    P1=0.000469766144541
    P2=0.00132121728152
    P3=0.0421027907045
    P4=0.9561062258695 轮迭代。
    P1=8.26733246251e-05
    P2=0.00023148530895
    P3=0.0421633955588
    P4=0.9575224458086 轮迭代。
    P1=1.86008444783e-05
    P2=3.72016889567e-05
    P3=0.0421681144324
    P4=0.9577760830347 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421766145735
    P4=0.9578233854268 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421647058824
    P4=0.9578352941189 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421804710241
    P4=0.95781952897610 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421713639475
    P4=0.95782863605211 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421743205248
    P4=0.95782567947512 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421623249511
    P4=0.95783767504913 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421676545301
    P4=0.9578323454714 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421864584325
    P4=0.95781354156715 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421977080433
    P4=0.95780229195716 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.042161055231
    P4=0.95783894476917 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0422000948317
    P4=0.95779990516818 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.042203092862
    P4=0.95779690713819 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421557707137
    P4=0.95784422928620 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0422046637117
    P4=0.95779533628821 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421588815433
    P4=0.95784111845722 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421745490005
    P4=0.95782545123 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.042220699109
    P4=0.95777930089124 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0422383227994
    P4=0.95776167720125 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421362926998
    P4=0.957863707326 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421216848674
    P4=0.95787831513327 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421144987936
    P4=0.95788550120628 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421805624075
    P4=0.95781943759329 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421636615811
    P4=0.95783633841930 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421216848674
    P4=0.95787831513331 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421052631579
    P4=0.95789473684232 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.042225730071
    P4=0.95777426992933 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421660008877
    P4=0.95783399911234 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0419370943585
    P4=0.95806290564235 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.042111173498
    P4=0.95788882650236 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.042297979798
    P4=0.95770202020237 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0419034090909
    P4=0.95809659090938 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0423322683706
    P4=0.95766773162939 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0422282120395
    P4=0.9577717879640 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0424242424242
    P4=0.95757575757641 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0420454545455
    P4=0.95795454545542 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421455938697
    P4=0.9578544061343 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0416666666667
    P4=0.95833333333344 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0420032310178
    P4=0.95799676898245 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0418181818182
    P4=0.95818181818246 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0428571428571
    P4=0.95714285714347 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0413793103448
    P4=0.95862068965548 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0413436692506
    P4=0.95865633074949 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0434782608696
    P4=0.9565217391350 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0424836601307
    P4=0.95751633986951 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0404411764706
    P4=0.95955882352952 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0413223140496
    P4=0.9586776859553 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0418604651163
    P4=0.95813953488454 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0418848167539
    P4=0.95811518324655 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0411764705882
    P4=0.95882352941256 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0397350993377
    P4=0.96026490066257 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0444444444444
    P4=0.95555555555658 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0416666666667
    P4=0.95833333333359 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0467289719626
    P4=0.95327102803760 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0421052631579
    P4=0.95789473684261 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0470588235294
    P4=0.95294117647162 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.04
    P4=0.9663 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.044776119403
    P4=0.95522388059764 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.05
    P4=0.9565 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0377358490566
    P4=0.96226415094366 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0425531914894
    P4=0.95744680851167 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.047619047619
    P4=0.95238095238168 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0526315789474
    P4=0.94736842105369 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.030303030303
    P4=0.96969696969770 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0344827586207
    P4=0.96551724137971 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0384615384615
    P4=0.96153846153872 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0434782608696
    P4=0.9565217391373 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.047619047619
    P4=0.95238095238174 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0526315789474
    P4=0.94736842105375 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0588235294118
    P4=0.94117647058876 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0666666666667
    P4=0.93333333333377 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0769230769231
    P4=0.92307692307778 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0
    P4=1.079 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0
    P4=1.080 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0
    P4=1.081 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0
    P4=1.082 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0
    P4=1.083 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0
    P4=1.084 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0
    P4=1.085 轮迭代。
    P1=0.0
    P2=0.0
    P3=0.0
    P4=1.086 轮迭代。
  • 相关阅读:
    angularJs实现级联操作
    FastDFS简单入门小demo
    FastDFS初步认识--上传下载流程介绍
    什么是spu和sku
    centOS7 flask项目布署
    Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.
    gunicorn+nginx配置方法
    supervisor的使用
    【linux】杀掉进程命令
    CentOS7 nginx安装与卸载
  • 原文地址:https://www.cnblogs.com/vovlie/p/2655643.html
Copyright © 2011-2022 走看看