PageRank与R语言实现

来源:互联网 发布:武汉破获一起新型网络 编辑:程序博客网 时间:2024/06/05 00:16


前言

Google搜索,早已成为我每天必用的工具,无数次惊叹它搜索结果的准确性。同时,我也在做Google的SEO,推广自己的博客。经过几个月尝试,我的博客PR到2了,外链也有几万个了。总结下来,还是感叹PageRank的神奇!

改变世界的算法,PageRank!

目录

  1. PageRank算法介绍
  2. PageRank算法原理
  3. PageRank算法的R语言实现

1. PageRank算法介绍

PageRank是Google专有的算法,用于衡量特定网页相对于搜索引擎索引中的其他网页而言的重要程度。它由Larry Page 和 Sergey Brin在20世纪90年代后期发明。PageRank实现了将链接价值概念作为排名因素。

PageRank让链接来”投票”

一个页面的“得票数”由所有链向它的页面的重要性来决定,到一个页面的超链接相当于对该页投一票。一个页面的PageRank是由所有链向它的页面(“链入页面”)的重要性经过递归算法得到的。一个有较多链入的页面会有较高的等级,相反如果一个页面没有任何链入页面,那么它没有等级。

简单一句话概括:从许多优质的网页链接过来的网页,必定还是优质网页。

PageRank的计算基于以下两个基本假设:

  • 数量假设:如果一个页面节点接收到的其他网页指向的入链数量越多,那么这个页面越重要
  • 质量假设:指向页面A的入链质量不同,质量高的页面会通过链接向其他页面传递更多的权重。所以越是质量高的页面指向页面A,则页面A越重要。

要提高PageRank有3个要点:

  • 反向链接数
  • 反向链接是否来自PageRank较高的页面
  • 反向链接源页面的链接数

2. PageRank算法原理

在初始阶段:网页通过链接关系构建起有向图,每个页面设置相同的PageRank值,通过若干轮的计算,会得到每个页面所获得的最终PageRank值。随着每一轮的计算进行,网页当前的PageRank值会不断得到更新。

在一轮更新页面PageRank得分的计算中,每个页面将其当前的PageRank值平均分配到本页面包含的出链上,这样每个链接即获得了相应的权值。而每个页面将所有指向本页面的入链所传入的权值求和,即可得到新的PageRank得分。当每个页面都获得了更新后的PageRank值,就完成了一轮PageRank计算。

1). 算法原理

PageRank算法建立在随机冲浪者模型上,其基本思想是:网页的重要性排序是由网页间的链接关系所决定的,算法是依靠网页间的链接结构来评价每个页面的等级和重要性,一个网页的PR值不仅考虑指向它的链接网页数,还有指向’指向它的网页的其他网页本身的重要性。

PageRank具有两大特性:

  • PR值的传递性:网页A指向网页B时,A的PR值也部分传递给B
  • 重要性的传递性:一个重要网页比一个不重要网页传递的权重要多

2). 计算公式:

pagerank-formula

  • PR(pi): pi页面的PageRank值
  • n: 所有页面的数量
  • pi: 不同的网页p1,p2,p3
  • M(i): pi链入网页的集合
  • L(j): pj链出网页的数量
  • d:阻尼系数, 任意时刻,用户到达某页面后并继续向后浏览的概率。
    (1-d=0.15) :表示用户停止点击,随机跳到新URL的概率
    取值范围: 0 < d ≤ 1, Google设为0.85

3). 构造实例:以4个页面的数据为例

pagerank-sample

图片说明:

  • ID=1的页面链向2,3,4页面,所以一个用户从ID=1的页面跳转到2,3,4的概率各为1/3
  • ID=2的页面链向3,4页面,所以一个用户从ID=2的页面跳转到3,4的概率各为1/2
  • ID=3的页面链向4页面,所以一个用户从ID=3的页面跳转到4的概率各为1
  • ID=4的页面链向2页面,所以一个用户从ID=4的页面跳转到2的概率各为1

构造邻接表:

链接源页面     链接目标页面    1             2,3,4    2             3,4    3             4    4             2

构造邻接矩阵(方阵):

  • 列:源页面
  • 行:目标页面
     [,1] [,2] [,3] [,4][1,]    0    0    0    0[2,]    1    0    0    1[3,]    1    1    0    0[4,]    1    1    1    0

转换为概率矩阵(转移矩阵)

     [,1] [,2] [,3] [,4][1,] 0      0    0    0[2,] 1/3    0    0    1[3,] 1/3  1/2    0    0[4,] 1/3  1/2    1    0

通过链接关系,我们就构造出了“转移矩阵”。

3. R语言单机算法实现

创建数据文件:page.csv

1,21,31,42,32,43,44,2

分别用下面3种方式实现PageRank:

  • 未考虑阻尼系统的情况
  • 包括考虑阻尼系统的情况
  • 直接用R的特征值计算函数

1). 未考虑阻尼系统的情况

R语言实现

#构建邻接矩阵adjacencyMatrix<-function(pages){  n<-max(apply(pages,2,max))  A <- matrix(0,n,n)  for(i in 1:nrow(pages)) A[pages[i,]$dist,pages[i,]$src]<-1  A}#变换概率矩阵probabilityMatrix<-function(G){  cs <- colSums(G)  cs[cs==0] <- 1  n <- nrow(G)  A <- matrix(0,nrow(G),ncol(G))  for (i in 1:n) A[i,] <- A[i,] + G[i,]/cs  A}#递归计算矩阵特征值eigenMatrix<-function(G,iter=100){  iter<-10  n<-nrow(G)  x <- rep(1,n)  for (i in 1:iter) x <- G %*% x  x/sum(x)}> pages<-read.table(file="page.csv",header=FALSE,sep=",")> names(pages)<-c("src","dist");pages  src dist1   1    22   1    33   1    44   2    35   2    46   3    47   4    2> A<-adjacencyMatrix(pages);A     [,1] [,2] [,3] [,4][1,]    0    0    0    0[2,]    1    0    0    1[3,]    1    1    0    0[4,]    1    1    1    0> G<-probabilityMatrix(A);G          [,1] [,2] [,3] [,4][1,] 0.0000000  0.0    0    0[2,] 0.3333333  0.0    0    1[3,] 0.3333333  0.5    0    0[4,] 0.3333333  0.5    1    0> q<-eigenMatrix(G,100);q          [,1][1,] 0.0000000[2,] 0.4036458[3,] 0.1979167[4,] 0.3984375

结果解读:

  • ID=1的页面,PR值是0,因为没有指向ID=1的页面
  • ID=2的页面,PR值是0.4,权重最高,因为1和4都指向2,4权重较高,并且4只有一个链接指向到2,权重传递没有损失
  • ID=3的页面,PR值是0.19,虽有1和2的指向了3,但是1和2还指向的其他页面,权重被分散了,所以ID=3的页面PR并不高
  • ID=4的页面,PR值是0.39,权重很高,因为被1,2,3都指向了

从上面的结果,我们发现ID=1的页面,PR值是0,那么ID=1的页,就不能向其他页面输出权重了,计算就会不合理!所以,增加d阻尼系数,修正没有链接指向的页面,保证页面的最小PR值>0,。

2). 包括考虑阻尼系统的情况

增加函数:dProbabilityMatrix

#变换概率矩阵,考虑d的情况dProbabilityMatrix<-function(G,d=0.85){  cs <- colSums(G)  cs[cs==0] <- 1  n <- nrow(G)  delta <- (1-d)/n  A <- matrix(delta,nrow(G),ncol(G))  for (i in 1:n) A[i,] <- A[i,] + d*G[i,]/cs  A}> pages<-read.table(file="page.csv",header=FALSE,sep=",")> names(pages)<-c("src","dist");pages  src dist1   1    22   1    33   1    44   2    35   2    46   3    47   4    2> A<-adjacencyMatrix(pages);A     [,1] [,2] [,3] [,4][1,]    0    0    0    0[2,]    1    0    0    1[3,]    1    1    0    0[4,]    1    1    1    0> G<-dProbabilityMatrix(A);G          [,1]   [,2]   [,3]   [,4][1,] 0.0375000 0.0375 0.0375 0.0375[2,] 0.3208333 0.0375 0.0375 0.8875[3,] 0.3208333 0.4625 0.0375 0.0375[4,] 0.3208333 0.4625 0.8875 0.0375> q<-eigenMatrix(G,100);q          [,1][1,] 0.0375000[2,] 0.3738930[3,] 0.2063759[4,] 0.3822311

增加阻尼系数后,ID=1的页面,就有值了PR(1)=(1-d)/n=(1-0.85)/4=0.0375,即无外链页面的最小值。

3). 直接用R的特征值计算函数

增加函数:calcEigenMatrix

#直接计算矩阵特征值calcEigenMatrix<-function(G){  x <- Re(eigen(G)$vectors[,1])  x/sum(x)}> pages<-read.table(file="page.csv",header=FALSE,sep=",")> names(pages)<-c("src","dist");pages  src dist1   1    22   1    33   1    44   2    35   2    46   3    47   4    2> A<-adjacencyMatrix(pages);A     [,1] [,2] [,3] [,4][1,]    0    0    0    0[2,]    1    0    0    1[3,]    1    1    0    0[4,]    1    1    1    0> G<-dProbabilityMatrix(A);G          [,1]   [,2]   [,3]   [,4][1,] 0.0375000 0.0375 0.0375 0.0375[2,] 0.3208333 0.0375 0.0375 0.8875[3,] 0.3208333 0.4625 0.0375 0.0375[4,] 0.3208333 0.4625 0.8875 0.0375> q<-calcEigenMatrix(G);q[1] 0.0375000 0.3732476 0.2067552 0.3824972

直接计算矩阵特征值,可以有效地减少的循环的操作,提高程序运行效率。

在了解PageRank的原理后,使用R语言构建PageRank模型,是非常容易的。实际应用中,我们也愿意用比较简单的方式建模,验证后,再用其他语言语言去企业应用!

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鸿运当头花谢了怎么办 鸿运当头花不红怎么办 众筹项目失败了怎么办 孕妇头发白了怎么办呢 猕猴桃坏了吃了怎么办 猕猴桃买的太硬怎么办 金艳猕猴桃很硬怎么办 猕猴桃又硬又酸怎么办 2岁宝宝生长缓慢怎么办 婴儿体重长得慢怎么办 人吃了乌药中毒怎么办 水中的氧气过少怎么办 怀孕9个月血糖高怎么办 怀孕的人血糖高怎么办 来月经很痛该怎么办 月经来了好痛怎么办 花呗额度用完了怎么办 老人长期卧床长了褥疮怎么办 5岁宝宝嗓子哑了怎么办 2岁宝宝喉咙嘶哑怎么办 1岁宝宝嗓子哑了怎么办 3个月婴儿嗓子哑怎么办 小孩一感冒就喘怎么办 狗打双黄连过敏怎么办 过敏怎么办怎么好的快 铁木砧板变形了怎么办 水泥地面起沙严重怎么办 横厅沙发不靠墙怎么办 吃多了胃疼怎么办 龙血树叶子干枯怎么办 龙血树叶尖发黄怎么办 茶花叶子掉光了怎么办 鸡虱子爬人身上怎么办 鸡的身上有虱子怎么办 鸡跳蚤在人身上怎么办 猫虱子到人身上怎么办 大人头上长虱子怎么办 头发上有剪发虫怎么办 头发长白色的虫怎么办 鼻子长暗疮很痛怎么办 80多岁老人肺癌怎么办