pagerank最开始是Google提出来用来衡量网页重要度排行的算法。
她的思想是基于网页之间互相的链接作为加权投票。假如网页a指向b,
那么网页b的重要程度受网页a的影响,a越重要,则b就越重要。假如网页c也指向b,
但是c跟a对比,c指向其他网页的数量(出度)较少,那么c对b的贡献程度要大于a对b。
下面是网页i的重要程度的公式,其中d是一个概率,in(i)表示所有指向网页i的网页。
这公式的思想是模拟一个随机冲浪者的浏览网页的行为,公式左边部分表示该冲浪者以(1-d)/N的概率从浏览器输入url的方式访问到网页i,公式右边部分表示从其他指向网页i的网页跳转过来的。多次迭代后,所有网页的重要性值会收敛。
用概率转移的方式表示,公式如下
一次迭代的计算的例子如下:
其中概率转移矩阵M,
每一列表示网页j的出度,每列的和加起来是1。
每一行表示网页i的入度。
个性化的pagerank
个性化的pagerank的目标是要计算所有节点相对于用户u的相关度。从用户u对应的节点开始游走,每到一个节点都以1-d的概率停止游走并从u重新开始,或者以d的概率继续游走,从当前节点指向的节点中按照均匀分布随机选择一个节点往下游走。这样经过很多轮游走之后,每个顶点被访问到的概率也会收敛趋于稳定,这个时候我们就可以用概率来进行排名了。
从公式可以看出,个性化的pagerank跟传统pagerank不同的是,每次重新游走时,总是从用户u节点开始。另外,每个节点权重初始化时,个性化的pagerank是这样子的,假如对用户u推荐,则对用户u节点初始化为1,其他节点都初始化为0。
下面是我分别用c++和java实现的个性化pagerank算法的源码
https://github.com/linger2012/personal-rank-implemented-by-CPP
https://github.com/linger2012/recommendation-algorithm-implemented-by-java/tree/master/src/personalrank
关于如何加速个性化pagerank,项亮的《推荐系统实战》有提到,用矩阵运算的方式来做。
这方面我还在学习研究阶段,欢迎来探讨。
参考资料:
http://blog.csdn.net/harryhuang1990/article/details/10048383
http://www.cnblogs.com/fengfenggirl/p/pagerank-introduction.html
《Topic-sensitive pagerank》
本文作者:linger
本文链接:http://blog.csdn.net/lingerlanlan/article/details/46991167
版权声明:本文为博主原创文章,未经博主允许不得转载。