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

posted on 2012-08-25 09:13  Vovolie  阅读(6842)  评论(9编辑  收藏  举报

导航