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#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.70831

第 2 轮迭代

0.15    1.64455    0.7379    1.46746

第 3 轮迭代

0.15    1.43983    0.89143    1.51864

第 4 轮迭代

0.15    1.48333    0.80442    1.56213

第 5 轮迭代

0.15    1.5203    0.82291    1.50666

第 6 轮迭代

0.14999    1.47315    0.83862    1.53809

第 7 轮迭代

0.14999    1.49986    0.81858    1.5314

第 8 轮迭代

0.14999    1.49418    0.82993    1.52572

第 9 轮迭代

0.14999    1.48935    0.82751    1.53295

第 10 轮迭代

0.14999    1.4955    0.82546    1.52885

第 11 轮迭代

0.14999    1.49201    0.82807    1.52971

第 12 轮迭代

0.14999    1.49274    0.82659    1.53045

第 13 轮迭代

0.14999    1.49337    0.8269    1.5295

第 14 轮迭代

0.14999    1.49256    0.82717    1.53003

第 15 轮迭代

0.14999    1.49301    0.82682    1.52991

第 16 轮迭代

0.14999    1.49291    0.82701    1.52981

第 17 轮迭代

0.14999    1.49282    0.82697    1.52993

第 18 轮迭代

0.14999    1.49292    0.82693    1.52986

第 19 轮迭代

0.14999    1.49286    0.82697    1.52987

第 20 轮迭代

0.14999    1.49287    0.82695    1.52987

第 21 轮迭代

0.14999    1.49287    0.82695    1.52985

第 22 轮迭代

0.14999    1.49285    0.82695    1.52986

第 23 轮迭代

0.14999    1.49286    0.82694    1.52985

第 24 轮迭代

0.14999    1.49285    0.82694    1.52984

第 25 轮迭代

0.14999    1.49284    0.82694    1.52984

第 26 轮迭代

0.14999    1.49284    0.82694    1.52983

第 27 轮迭代

0.14998    1.49284    0.82693    1.52983

第 28 轮迭代

0.14998    1.49283    0.82693    1.52982

第 29 轮迭代

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.645363845671

第 2 轮迭代。

P1=0.0177595628415

P2=0.0409836065574

P3=0.0409836065574

P4=0.900273224044

第 3 轮迭代。

P1=0.00261177626645

P2=0.0085593855861

P3=0.0417625610923

P4=0.947066277055

第 4 轮迭代。

P1=0.000469766144541

P2=0.00132121728152

P3=0.0421027907045

P4=0.956106225869

第 5 轮迭代。

P1=8.26733246251e-05

P2=0.00023148530895

P3=0.0421633955588

P4=0.957522445808

第 6 轮迭代。

P1=1.86008444783e-05

P2=3.72016889567e-05

P3=0.0421681144324

P4=0.957776083034

第 7 轮迭代。

P1=0.0

P2=0.0

P3=0.0421766145735

P4=0.957823385426

第 8 轮迭代。

P1=0.0

P2=0.0

P3=0.0421647058824

P4=0.957835294118

第 9 轮迭代。

P1=0.0

P2=0.0

P3=0.0421804710241

P4=0.957819528976

第 10 轮迭代。

P1=0.0

P2=0.0

P3=0.0421713639475

P4=0.957828636052

第 11 轮迭代。

P1=0.0

P2=0.0

P3=0.0421743205248

P4=0.957825679475

第 12 轮迭代。

P1=0.0

P2=0.0

P3=0.0421623249511

P4=0.957837675049

第 13 轮迭代。

P1=0.0

P2=0.0

P3=0.0421676545301

P4=0.95783234547

第 14 轮迭代。

P1=0.0

P2=0.0

P3=0.0421864584325

P4=0.957813541567

第 15 轮迭代。

P1=0.0

P2=0.0

P3=0.0421977080433

P4=0.957802291957

第 16 轮迭代。

P1=0.0

P2=0.0

P3=0.042161055231

P4=0.957838944769

第 17 轮迭代。

P1=0.0

P2=0.0

P3=0.0422000948317

P4=0.957799905168

第 18 轮迭代。

P1=0.0

P2=0.0

P3=0.042203092862

P4=0.957796907138

第 19 轮迭代。

P1=0.0

P2=0.0

P3=0.0421557707137

P4=0.957844229286

第 20 轮迭代。

P1=0.0

P2=0.0

P3=0.0422046637117

P4=0.957795336288

第 21 轮迭代。

P1=0.0

P2=0.0

P3=0.0421588815433

P4=0.957841118457

第 22 轮迭代。

P1=0.0

P2=0.0

P3=0.0421745490005

P4=0.957825451

第 23 轮迭代。

P1=0.0

P2=0.0

P3=0.042220699109

P4=0.957779300891

第 24 轮迭代。

P1=0.0

P2=0.0

P3=0.0422383227994

P4=0.957761677201

第 25 轮迭代。

P1=0.0

P2=0.0

P3=0.0421362926998

P4=0.9578637073

第 26 轮迭代。

P1=0.0

P2=0.0

P3=0.0421216848674

P4=0.957878315133

第 27 轮迭代。

P1=0.0

P2=0.0

P3=0.0421144987936

P4=0.957885501206

第 28 轮迭代。

P1=0.0

P2=0.0

P3=0.0421805624075

P4=0.957819437593

第 29 轮迭代。

P1=0.0

P2=0.0

P3=0.0421636615811

P4=0.957836338419

第 30 轮迭代。

P1=0.0

P2=0.0

P3=0.0421216848674

P4=0.957878315133

第 31 轮迭代。

P1=0.0

P2=0.0

P3=0.0421052631579

P4=0.957894736842

第 32 轮迭代。

P1=0.0

P2=0.0

P3=0.042225730071

P4=0.957774269929

第 33 轮迭代。

P1=0.0

P2=0.0

P3=0.0421660008877

P4=0.957833999112

第 34 轮迭代。

P1=0.0

P2=0.0

P3=0.0419370943585

P4=0.958062905642

第 35 轮迭代。

P1=0.0

P2=0.0

P3=0.042111173498

P4=0.957888826502

第 36 轮迭代。

P1=0.0

P2=0.0

P3=0.042297979798

P4=0.957702020202

第 37 轮迭代。

P1=0.0

P2=0.0

P3=0.0419034090909

P4=0.958096590909

第 38 轮迭代。

P1=0.0

P2=0.0

P3=0.0423322683706

P4=0.957667731629

第 39 轮迭代。

P1=0.0

P2=0.0

P3=0.0422282120395

P4=0.95777178796

第 40 轮迭代。

P1=0.0

P2=0.0

P3=0.0424242424242

P4=0.957575757576

第 41 轮迭代。

P1=0.0

P2=0.0

P3=0.0420454545455

P4=0.957954545455

第 42 轮迭代。

P1=0.0

P2=0.0

P3=0.0421455938697

P4=0.95785440613

第 43 轮迭代。

P1=0.0

P2=0.0

P3=0.0416666666667

P4=0.958333333333

第 44 轮迭代。

P1=0.0

P2=0.0

P3=0.0420032310178

P4=0.957996768982

第 45 轮迭代。

P1=0.0

P2=0.0

P3=0.0418181818182

P4=0.958181818182

第 46 轮迭代。

P1=0.0

P2=0.0

P3=0.0428571428571

P4=0.957142857143

第 47 轮迭代。

P1=0.0

P2=0.0

P3=0.0413793103448

P4=0.958620689655

第 48 轮迭代。

P1=0.0

P2=0.0

P3=0.0413436692506

P4=0.958656330749

第 49 轮迭代。

P1=0.0

P2=0.0

P3=0.0434782608696

P4=0.95652173913

第 50 轮迭代。

P1=0.0

P2=0.0

P3=0.0424836601307

P4=0.957516339869

第 51 轮迭代。

P1=0.0

P2=0.0

P3=0.0404411764706

P4=0.959558823529

第 52 轮迭代。

P1=0.0

P2=0.0

P3=0.0413223140496

P4=0.95867768595

第 53 轮迭代。

P1=0.0

P2=0.0

P3=0.0418604651163

P4=0.958139534884

第 54 轮迭代。

P1=0.0

P2=0.0

P3=0.0418848167539

P4=0.958115183246

第 55 轮迭代。

P1=0.0

P2=0.0

P3=0.0411764705882

P4=0.958823529412

第 56 轮迭代。

P1=0.0

P2=0.0

P3=0.0397350993377

P4=0.960264900662

第 57 轮迭代。

P1=0.0

P2=0.0

P3=0.0444444444444

P4=0.955555555556

第 58 轮迭代。

P1=0.0

P2=0.0

P3=0.0416666666667

P4=0.958333333333

第 59 轮迭代。

P1=0.0

P2=0.0

P3=0.0467289719626

P4=0.953271028037

第 60 轮迭代。

P1=0.0

P2=0.0

P3=0.0421052631579

P4=0.957894736842

第 61 轮迭代。

P1=0.0

P2=0.0

P3=0.0470588235294

P4=0.952941176471

第 62 轮迭代。

P1=0.0

P2=0.0

P3=0.04

P4=0.96

第 63 轮迭代。

P1=0.0

P2=0.0

P3=0.044776119403

P4=0.955223880597

第 64 轮迭代。

P1=0.0

P2=0.0

P3=0.05

P4=0.95

第 65 轮迭代。

P1=0.0

P2=0.0

P3=0.0377358490566

P4=0.962264150943

第 66 轮迭代。

P1=0.0

P2=0.0

P3=0.0425531914894

P4=0.957446808511

第 67 轮迭代。

P1=0.0

P2=0.0

P3=0.047619047619

P4=0.952380952381

第 68 轮迭代。

P1=0.0

P2=0.0

P3=0.0526315789474

P4=0.947368421053

第 69 轮迭代。

P1=0.0

P2=0.0

P3=0.030303030303

P4=0.969696969697

第 70 轮迭代。

P1=0.0

P2=0.0

P3=0.0344827586207

P4=0.965517241379

第 71 轮迭代。

P1=0.0

P2=0.0

P3=0.0384615384615

P4=0.961538461538

第 72 轮迭代。

P1=0.0

P2=0.0

P3=0.0434782608696

P4=0.95652173913

第 73 轮迭代。

P1=0.0

P2=0.0

P3=0.047619047619

P4=0.952380952381

第 74 轮迭代。

P1=0.0

P2=0.0

P3=0.0526315789474

P4=0.947368421053

第 75 轮迭代。

P1=0.0

P2=0.0

P3=0.0588235294118

P4=0.941176470588

第 76 轮迭代。

P1=0.0

P2=0.0

P3=0.0666666666667

P4=0.933333333333

第 77 轮迭代。

P1=0.0

P2=0.0

P3=0.0769230769231

P4=0.923076923077

第 78 轮迭代。

P1=0.0

P2=0.0

P3=0.0

P4=1.0

第 79 轮迭代。

P1=0.0

P2=0.0

P3=0.0

P4=1.0

第 80 轮迭代。

P1=0.0

P2=0.0

P3=0.0

P4=1.0

第 81 轮迭代。

P1=0.0

P2=0.0

P3=0.0

P4=1.0

第 82 轮迭代。

P1=0.0

P2=0.0

P3=0.0

P4=1.0

第 83 轮迭代。

P1=0.0

P2=0.0

P3=0.0

P4=1.0

第 84 轮迭代。

P1=0.0

P2=0.0

P3=0.0

P4=1.0

第 85 轮迭代。

P1=0.0

P2=0.0

P3=0.0

P4=1.0

第 86 轮迭代。

你可能感兴趣的:(python实现pagerank)