(1)谷歌网页怎么排序?html
(2)怎么处理垃圾网页?
那么问题来了,假若有某个垃圾网页中虽然也包含大量的查询词,但却并不是知足用户须要的文档,所以,页面自己的重要性在网页排序中也起着很重要的做用。
(3)如何度量网页自己的重要性?
实际上互联网上的每一篇HTML文档除了包含文本、图片、视频等信息外,还包含了大量的连接关系,利用这些连接关系,可以发现某些重要的网页,其中网页是节点,网页间的连接关系是边。node
如上图,某网页1链向网页2,则能够认为网页1以为网页2有连接价值,是比较重要的网页。某网页被指向的次数越多,则它的重要性越高;越是重要的网页,所连接的网页的重要性也越高。
经过下图咱们能够更形象地看出链向网页E的连接远远大于链向网页C的连接,可是网页C的重要性却大于网页E。这是由于网页C被网页B所连接,而网页B有很高的重要性。python
(4)PageRank核心思想
PageRank对网页的排序能够独立于用户搜索进行。若是一个网页被不少其它网页所连接,说明它受到广泛的认可和信赖,那么它的排名就高。这就是 Page Rank 的核心思想。固然 Google 的 Page Rank 算法实际上要复杂得多。好比说,对来自不一样网页的连接对待不一样,自己网页排名高的连接更可靠,因而给这些连接予较大的权重。
通俗理解,咱们能够将互联网中的网页理解成咱们现实中的每一个人,人与人之间的联系就相似于网页与网页之间联系,通常人的社交影响力是跟其人脉的广度与人脉的质量有关,网页也同理,其重要性也跟网页的被链的数量与质量有关。
具体参考:PageRank算法讲解;PageRank算法--从原理到实现算法
利用PageRank随机浏览模型求以下图个网页的PageRank值。spring
即网页之间的关系以下表格:微信
连接源ID | 连接目标 ID |
---|---|
1 | 2,3,4,5, 7 |
2 | 1 |
3 | 1,2 |
4 | 2,3,5 |
5 | 1,3,4,6 |
6 | 1,5 |
7 | 5 |
""" Created on Sun Jan 8 23:41:29 2017 @author: whenif """ import numpy as np import networkx as nx import matplotlib.pyplot as plt def getGm(A): ''' 功能:求状态转移几率矩阵Gm @A:网页连接图的邻接矩阵 ''' Gm = [] for i in range(len(A)): cnt = 0 for j in range(len(A[i])): if A[i][j] != 0: cnt += 1 tran_prob = 1/cnt#转移几率 Gm_tmp = [] for j in range(len(A[i])): Gm_tmp.append(tran_prob*A[i][j]) Gm.append(Gm_tmp) Gm = np.transpose(Gm) return Gm def getBaseLev(N): ''' 功能:计算网页所得到的基本级别(1-P)*e/n @N:网页总个数 ''' P = 0.85 e = np.ones(N) R = [ [(1-P)*i*1/N] for i in e ] return R def getPR(P,Gm,R,PR): ''' 功能:获取PR值 @P:加权系数,一般取 0.85 左右,按照超连接进行浏览的几率 @Gm:状态转移几率矩阵 @R:网页所得到的基本级别 @PR:每一个网页节点的PageRank值 ''' #状态转移几率矩阵Gm与PR值相乘矩阵相乘 Gm_PR = np.dot(Gm,PR) #矩阵乘以常数P P_Gm_PR = P*Gm_PR #矩阵相加 new_PR = P_Gm_PR+R #PR=P*Gm'PR+(1-d)*e/n PageRank算法的核心 return new_PR def res_vis(A,PR): ''' 将计算出来的值进行可视化展现 @A:网页连接图的邻接矩阵 @PR:每一个网页节点最终的PageRank值 ''' #G=nx.Graph()构造的是无向图, G=nx.DiGraph()构造的是有向图 #初始化有向图,节点数为7,edge(边)被创造的随机几率 all_edges = [] for i in range(7): for j in range(len(A)): if A[i][j]==1: all_edges.append([i+1,j+1]) #(1)初始化有向图 G = nx.DiGraph() #(2)添加节点 G.add_nodes_from(range(1,len(A))) #(3)添加有向边 G.add_edges_from(all_edges) #(4)添加PR值 pr = {} for i in range(len(PR)): pr[i+1] = PR[i][0] # (5)画图 layout = nx.spring_layout(G) plt.figure(1) nx.draw(G, pos=layout, node_size=[x * 6000 for x in pr.values()], node_color='m',with_labels=True) plt.show() def main(): #初始化参数 N = 7 #网页个数 P = 0.85 #一个加权系数,一般取 0.85 左右,按照超连接进行浏览的几率 #网页连接图的邻接矩阵,每一列表示一个网页的出度 A = np.array([[0,1,1,0,1,1,0], [1,0,1,1,0,0,0], [1,0,0,1,1,0,0], [1,0,0,0,1,0,0], [1,0,0,1,0,1,1], [0,0,0,0,1,0,0], [1,0,0,0,0,0,0]]) A = np.transpose(A) #转置 #初始化PR值为0 new_PR = [] for i in range(N): new_PR.append([0]) count = 0#迭代计数器 while True: PR = new_PR R = getBaseLev(N) Gm = getGm(A) new_PR = getPR(P,Gm,R,PR) count = count +1 print("第 %s 轮迭代" % count) print(str(round(new_PR[0][0],5)) +"\t" + str(round(new_PR[1][0],5)) + "\t" + str(round(new_PR[2][0],5)) + "\t" + str(round(new_PR[3][0],5)) + "\t" + str(round(new_PR[4][0],5)) + "\t" + str(round(new_PR[5][0],5)) + "\t" + str(round(new_PR[6][0],5))) #设置迭代条件 if ( round(PR[0][0],5)==round(new_PR[0][0],5) and round(PR[1][0],5)==round(new_PR[1][0],5) and round(PR[2][0],5)==round(new_PR[2][0],5) and round(PR[3][0],5)==round(new_PR[3][0],5) and round(PR[4][0],5)==round(new_PR[4][0],5) and round(PR[5][0],5)==round(new_PR[5][0],5) and round(PR[6][0],5)==round(new_PR[6][0],5)): break print("-------------------") print("PageRank值已计算完成") res_vis(A,new_PR) if __name__ == '__main__': main()
(1)迭代结果网络
第 1 轮迭代 0.02143 0.02143 0.02143 0.02143 0.02143 0.02143 0.02143 第 2 轮迭代 0.06241 0.04025 0.0357 0.02963 0.05846 0.02598 0.02507 ...... 第 57 轮迭代 0.28026 0.15875 0.13887 0.10821 0.18418 0.06057 0.06907 第 58 轮迭代 0.28026 0.15875 0.13887 0.10821 0.18418 0.06057 0.06907 ------------------- PageRank值已计算完成
(2)可视化结果app
其中圆圈编号表示网页ID,圆圈大小表示PR值大小,连线表示网页之间的关系,有带黑色箭头表示出度方向。
(3)结果汇总优化
名次 | PageRank值 | 网页ID | 发出连接ID | 被连接ID |
---|---|---|---|---|
1 | 0.28026 | 1 | 2,3,4,5,7 | 2,3,5,6 |
2 | 0.18418 | 5 | 1,3,4,6 | 1,4,6,7 |
3 | 0.15875 | 2 | 1 | 1,3,4 |
4 | 0.13887 | 3 | 1,2 | 1,4,5 |
5 | 0.10821 | 4 | 2,3,5 | 1,5 |
6 | 0.06907 | 7 | 5 | 1 |
7 | 0.06057 | 6 | 1,5 | 5 |
(4)结果分析.net
附另外一个简单的PageRank程序:
from numpy import * a = array([[0,1,1,0], [1,0,0,1], [1,0,0,1], [1,1,0,0]],dtype = float) #dtype指定为float def graphMove(a): #构造转移矩阵 c = zeros((a.shape),dtype = float) for i in range(a.shape[0]): for j in range(a.shape[1]): c[i][j] = a[i][j] / (a[:, j].sum()) #完成初始化分配 return c def pageRank(p,m,v): #计算pageRank值 #判断pr矩阵是否收敛,(v == p*dot(m,v) + (1-p)*v).all()判断先后的pr矩阵是否相等,若相等则中止循环 while((v == p*dot(m,v) + (1-p)*v).all()==False): v = p*dot(m,v) + (1-p)*v return v if __name__=="__main__": M = graphMove(a) pr = array([float(1)/M.shape[0] for _ in range(M.shape[0])]) #pr值的初始化 p = 0.8 #引入浏览当前网页的几率为p,假设p=0.8 print pageRank(p,M,pr) # 计算pr值
在数据分析咱们常常须要从用户的角度思考问题,如用户购买路径,用户之因此没产生购买,那么究竟是在哪一个环节出现了问题?基于用户还有许许多多的分析问题,如流失用户分析、流失用户预警、用户信用度分析等。
从基于用户的分析咱们能够延伸到用户与信息、用户与商品、用户与用户之间的分析,固然这三点对号入座的便分别是BAT的基因所在,其中人与人之间的分析便是社交关系分析,这也是PageRank适合的领域之一。在不一样行业的应用场景不用,如如下应用场景:
数据分析与挖掘不少都是从人出发,逐渐延伸到人与人,甚至是人、人与人在时间与空间上的表现,其中人与人之间的关系能够说是很重要的一环,因此我的以为PageRank仍是有挺大的应用性,在工做中也是深有体会。固然文中只是举了简单的例子并实现,代码可优化的地方应该很多,望各路小伙伴一块儿交流一块儿进步。