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