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 輪迭代。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM