Pagerank的C++实现原理

来源:互联网 发布:云计算产业链市场份额 编辑:程序博客网 时间:2024/05/20 11:20

Pagerank的实现原理

Pagerank网页排名,借鉴了学术界评判学术论文重要性的通用方法, 那就是看论文的引用次数。由此想到网页的重要性也可以根据这种方法来评价。即:

如果一个网页被很多其他网页链接到的话说明这个网页比较重要,也就是PageRank值会相对较高. 
如果一个PageRank值很高的网页链接到一个其他的网页,那么被链接到的网页的PageRank值会相应地因此而提高.

目录

  • Pagerank的实现原理
    • 目录
    • PageRank简析
        • 问题1Pagerank是什么
        • 问题2PageRank怎么计算
    • 链接关系的表示形式
        • 邻接矩阵G
        • 状态转移概率矩阵Gm
        • 校正基础矩阵
        • 幂次迭代矩阵A
    • 链接关系在程序中的存储形式
    • 迭代规则和原理
        • 为什么要进行幂次迭代
        • 如何进行幂次迭代
    • 迭代在程序中的具体实现


PageRank简析

问题1:Pagerank是什么

将各网页之间的链接关系按照下文中的矩阵A形式表示,那么各个网页的PageRank值将组成一个长度为URLNUM的列向量,该列向量就是矩阵A特征值为1对应的特征向量。 
使用简单的符号标识不同的标题,将某些文字标记为粗体或者斜体,创建一个链接等,详细语法参考帮助?。

问题2:PageRank怎么计算

计算步骤非常简单,获取链接关系并存储->做矩阵校正->初始化pagerank列向量->幂次迭代直到满足条件->排序输出TOP10。 
其中获取链接关系并存储可以查看“链接关系的表示形式”和“链接关系在程序中的存储形式”;为什么要做矩阵校正,可以参考矩阵校正的原因。如何进行幂次迭代,可以参考。具体的幂次迭代的实现,可以查看“迭代规则和原理”和“迭代在程序中的具体实现”。

链接关系的表示形式

设定参与PageRank计算的所有URL数目为URLNUM,该数值可以在从文件中读取网页的时候进行统计。

所有网页有固定的编号,从0~URLNUM或者从1~(URLNUM-1),各个网页的链接关系由两个编号表示,例如“ 1 4”表示从编号为1的网页可以连接到编号为4的网页。同时本项目支持从后者编号连接到前者编号对应网页的表示形式。

邻接矩阵G

用邻接矩阵表示各个网页之间的链接关系,为了方便迭代中矩阵相乘的运算,要求G_ij中的某一个元素是从ID= i 的源网页链接到ID= j 的目的网页的关系值。如果有链接关系值为1,如果没有链接关系值为0。换句话来说,行号对应的是目的网页ID,而列号对应的是源网页ID,且邻接矩阵的大小是URLNUM x URLNUM.

状态转移概率矩阵Gm

设定每一个网页的pagerank初始值为1,那么由该网页链接出linkOutNum个网页,每个网页获得的pagerank值为1/linkOutNum。将邻接矩阵当中的非零元素值都进行这样的计算之后再替换原本所有的1。状态转移概率矩阵的大小也为URLNUM x URLNUM.

校正基础矩阵

为了避免link seal等问题,需要根据公式进行校正。如果,那么就会有一个校正基础矩阵,与邻接矩阵叠加形成最后参与幂次迭代矩阵A。校正基础矩阵的每一个元素都等于,且大小为URLNUM x URLNUM.

宁波整形医院http://www.zuanno.com/
宁波好的整形医院http://www.zuanno.com/

幂次迭代矩阵A

校正基础矩阵与叠加形成参与幂次迭代的矩阵。大小为URLNUM x URLNUM.

链接关系在程序中的存储形式

链接关系在程序中用邻接矩阵表示,但是考虑邻接矩阵中零元素很多,可以采用稀疏矩阵存储。本项目中采用COO稀疏矩阵模式,用行数组、列数组和value数组三个数组,将非零元素的位置(行、列)和值(value)存储下来。

值得注意的是,由于邻接矩阵中行号标识目的网页ID,列号标识源网页ID。所以COO稀疏矩阵中,行数组存储邻接矩阵中非零元素位置的行号,即存储的都是目的网页ID;列数组存储该非零元素的列号,即存储的都是源网页ID; value数组用来存储这个非零元素的值。并且,行数组、列数组和value数组的同一位置元素值,刚好可以还原一个非零元素的位置信息和值信息。那么,容易知道行数组和列数组应该定义为int类型,而value数组应该定义为float类型。

迭代规则和原理

该小节主要解析两个问题:为什么要进行幂次迭代;如何进行幂次迭代。

为什么要进行幂次迭代

首先,要知道所谓的各个网页的pagerank值,其实是关于矩阵A的特征值为1的特征向量。要求pagerank值就是要求特征向量。求解特征向量的计算规模是O(),也就是求得慢而且求不准。所以只能采用迭代的方式,最终迭代出收敛的特征向量,也即待求的pagerank数组。

如何进行幂次迭代

迭代初始向量PageRank[URLNUM]与幂次迭代矩阵A相乘,直到满足精度条件。即

LastRank[ URLNUM ] = PageRank[URLNUM]

PageRank[URLNUM] = A× LastRank [ URLNUM ]

Until |PageRank[URLNUM] – LastRank[URLNUM]| < limitation

迭代在程序中的具体实现

在程序具体实现矩阵相乘迭代过程中,首先将所有元素点都按照无链接关系处理,完成一部分累加。然后遍历COO数组,将有链接关系的点重新累加到迭代关系中,同时减去原本该位置按照无链接关系处理时的累加值。最终即可得到完成所有累加操作的pagerank数组。具体原因见下图: 
矩阵相乘迭代累加原理