Python实现PageRank算法

看了《数学之美》第十章:PageRank,里面讲到

计算搜索结果的网页排名过程中需要用到网页本身的排名,这不成了“先有鸡还是先有蛋”的问题了吗?
破解这个怪圈的应该是布林。他把这个问题变成了一个二维矩阵相乘的问题,并用迭代的方法解决了这个问题。他们先假定所有网页的排名是相同的,并且根据这个初始值,算出各个网页的第一次迭代排名,然后再根据第一次迭代排名算出第二次的排名。他们两人从理论上证明了不论初始值如何选取,这种算法都能保证网页排名的估计值能收敛到排名的真实值。值得一提的是,这种算法不需要任何人工干预。

然后花了十几分钟写出了下面的链接权重分配代码,结果的确收敛。

# -*- coding: utf-8 -*-
from __future__ import division

T = 0.000000001
page_rank = [1.5, 1, 0.5, 0.5, 1.5]
page_links = [[0, 1, 1, 0, 0],
              [1, 0, 1, 0, 1],
              [1, 1, 0, 1, 1],
              [0, 0, 1, 0, 1],
              [0, 1, 1, 1, 0]]
weights = []
for page_link in page_links:
    link = sum(page_link)
    page_weight = []
    for page in page_link:
        if page == 1:
            page_weight.append(1/link)
        else:
            page_weight.append(0)
    weights.append(page_weight)

# print weights

while True:
    page_rank_out = len(page_rank) * [0]
    for page_rank_now, page_weight_out in zip(page_rank, weights):
        page_rank_now_out = map(lambda x: page_rank_now * x, page_weight_out)
        page_rank_out = map(lambda x: sum(x), zip(page_rank_out, page_rank_now_out))

    check_stable = True
    for rank, rank_out in zip(page_rank, page_rank_out):
        if rank - rank_out >= T:
            check_stable = False
    if check_stable:
        break

    page_rank = page_rank_out
    print page_rank


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值