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