PageRank算法简介及Map-Reduce实现

  本文转自PageRank算法简介及Map-Reduce实现



  PageRank对网页排名的算法,曾是Google发家致富的法宝。以前虽然有实验过,但理解还是不透彻,这几天又看了一下,这里总结一下PageRank算法的基本原理。

什么是PageRank

  PageRank的Page可是认为是网页,表示网页排名,也可以认为是Larry Page(google 产品经理),因为他是这个算法的发明者之一,还是google CEO(^_^)。PageRank算法计算每一个网页的PageRank值,然后根据这个值的大小对网页的重要性进行排序。它的思想是模拟一个悠闲的上网者,上网者首先随机选择一个网页打开,然后在这个网页上呆了几分钟后,跳转到该网页所指向的链接,这样无所事事、漫无目的地在网页上跳来跳去,PageRank就是估计这个悠闲的上网者分布在各个网页上的概率。

简单PageRank模型

  互联网中的网页可以看出是一个有向图,其中网页是结点,如果网页A有链接到网页B,则存在一条有向边A->B,下面是一个简单的示例:
这里写图片描述
这个例子中只有四个网页,如果当前在A网页,那么悠闲的上网者将会各以1/3的概率跳转到B、C、D,这里的3表示A有3条出链,如果一个网页有k条出链,那么跳转任意一个出链上的概率是1/k,同理D到B、C的概率各为1/2,而B到C的概率为0。一般用转移矩阵表示上网者的跳转概率,如果用n表示网页的数目,则转移矩阵M是一个n*n的方阵;如果网页j有k个出链,那么对每一个出链指向的网页i,有M[i][j]=1/k,而其他网页的M[i][j]=0;上面示例图对应的转移矩阵如下:
这里写图片描述
初试时,假设上网者在每一个网页的概率都是相等的,即1/n,于是初试的概率分布就是一个所有值都为1/n的n维列向量V0,用V0去右乘转移矩阵M,就得到了第一步之后上网者的概率分布向量MV0,(nXn)*(nX1)依然得到一个nX1的矩阵。下面是V1的计算过程:
这里写图片描述
注意矩阵M中M[i][j]不为0表示用一个链接从j指向i,M的第一行乘以V0,表示累加所有网页到网页A的概率即得到9/24。得到了V1后,再用V1去右乘M得到V2,一直下去,最终V会收敛,即Vn=MV(n-1),上面的图示例,不断的迭代,最终V=[3/9,2/9,2/9,2/9]’:
这里写图片描述

终止点问题

上述上网者的行为是一个马尔科夫过程的实例,要满足收敛性,需要具备一个条件:

  • 图是强连通的,即从任意网页可以到达其他任意网页:
    互联网上的网页不满足强连通的特性,因为有一些网页不指向任何网页,如果按照上面的计算,上网者到达这样的网页后便走投无路、四顾茫然,导致前面累计得到的转移概率被清零,这样下去,最终的得到的概率分布向量所有元素几乎都为0。假设我们把上面图中C到A的链接丢掉,C变成了一个终止点,得到下面这个图:
    这里写图片描述
    对应的转移矩阵为:
    这里写图片描述
    连续迭代下去,最终所有元素都为0:
    这里写图片描述
陷阱问题

  另外一个问题就是陷阱问题,即有些网页不存在指向其他网页的链接,但存在指向自己的链接。比如下面这个图:
这里写图片描述
上网者跑到C网页后,就像跳进了陷阱,陷入了漩涡,再也不能从C中出来,将最终导致概率分布值全部转移到C上来,这使得其他网页的概率分布值为0,从而整个网页排名就失去了意义。如果按照上面图对应的转移矩阵为:
这里写图片描述
不断的迭代下去,就变成了这样:
这里写图片描述

解决终止点问题和陷阱问题

  上面过程,我们忽略了一个问题,那就是上网者是一个悠闲的上网者,而不是一个愚蠢的上网者,我们的上网者是聪明而悠闲,他悠闲,漫无目的,总是随机的选择网页,他聪明,在走到一个终结网页或者一个陷阱网页(比如两个示例中的C),不会傻傻的干着急,他会在浏览器的地址随机输入一个地址,当然这个地址可能又是原来的网页,但这里给了他一个逃离的机会,让他离开这万丈深渊。模拟聪明而又悠闲的上网者,对算法进行改进,每一步,上网者可能都不想看当前网页了,不看当前网页也就不会点击上面的连接,而上悄悄地在地址栏输入另外一个地址,而在地址栏输入而跳转到各个网页的概率是1/n。假设上网者每一步查看当前网页的概率为a,那么他从浏览器地址栏跳转的概率为(1-a),于是原来的迭代公式转化为:
            这里写图片描述
  现在我们来计算带陷阱的网页图的概率分布:
这里写图片描述
重复迭代下去,得到:
这里写图片描述
可以看到C虽然占了很大一部分pagerank值,但其他网页页获得的一些值,因此C的链接结构,它的权重确实应该会大些。

用Map-reduce计算Page Rank

  上面的演算过程,采用矩阵相乘,不断迭代,直到迭代前后概率分布向量的值变化不大,一般迭代到30次以上就收敛了。真的的web结构的转移矩阵非常大,目前的网页数量已经超过100亿,转移矩阵是100亿*100亿的矩阵,直接按矩阵乘法的计算方法不可行,需要借助Map-Reduce的计算方式来解决。实际上,google发明Map-Reduce最初就是为了分布式计算大规模网页的pagerank,Map-Reduce的pagerank有很多实现方式,我这里计算一种简单的。
  考虑转移矩阵是一个很多的稀疏矩阵,我们可以用稀疏矩阵的形式表示,我们把web图中的每一个网页及其链出的网页作为一行,这样第四节中的web图结构用如下方式表示:
  

1 A B C D
2 B A D
3 C C
4 D B C

A有三条出链,分别指向B、C、D,实际上,我们爬取的网页结构数据就是这样的。

  1. Map阶段
    Map操作的每一行,对所有出链发射当前网页概率值的1/k,k是当前网页的出链数,比如对第一行输出(B,1/3*1/4),(C,1/3*1/4),(D,1/3*1/4);
  2. Reduce阶段
    Reduce操作收集网页id相同的值,累加并按权重计算,pj=a*(p1+p2+…Pm)+(1-a)*1/n,其中m是指向网页j的网页j数,n所有网页数。

      思路就是这么简单,但是实践的时候,怎样在Map阶段知道当前行网页的概率值,需要一个单独的文件专门保存上一轮的概率分布值,先进行一次排序,让出链行与概率值按网页id出现在同一Mapper里面,整个流程如下:
    这里写图片描述
    这样进行一次迭代相当于需要两次MapReduce,但第一次的MapReduce只是简单的排序,不需要任何操作,用python调用Hadoop的Streaming.
    SortMappert.py代码如下:

#!/bin/python
'''Mapper for sort'''
import sys
for line in sys.stdin:
     print line.strip()

 SortReducer.py也是一样
 

#!/bin/python
'''Reducer for sort'''
import sys
for line in sys.stdin:
     print line.strip()

PageRankMapper.py代码:

''' mapper of pangerank algorithm'''
import sys
id1 = id2 = None
heros = value = None
count1 = count2 = 0

for line in sys.stdin:
    data = line.strip().split('\t')
    if len(data) == 3 and data[1] == 'a':# This is the pangerank value
        count1 += 1
        if count1 >= 2:
            print '%s\t%s' % (id1,0.0)

        id1 = data[0]
        value = float(data[2]) 
    else:#This the link relation
        id2 = data[0]
        heros = data[1:]
    if id1 == id2 and id1:
        v = value / len(heros)
        for hero in heros:
            print '%s\t%s' % (hero,v)
        print '%s\t%s' % (id1,0.0)
        id1 = id2 = None
        count1 = 0

PageRankReducer.py代码:

''' reducer of pagerank algorithm'''
import sys
last = None
values = 0.0
alpha = 0.8
N = 4# Size of the web pages
for line in sys.stdin:
    data = line.strip().split('\t')
    hero,value = data[0],float(data[1])
    if data[0] != last:
        if last:
            values = alpha * values + (1 - alpha) / N
            print '%s\ta\t%s' % (last,values)
        last = data[0]
        values = value
    else:
        values += value #accumulate the page rank value
if last:
    values = alpha * values + (1 - alpha) / N
    print '%s\ta\t%s' % (last,values)

在linux下模仿Map-Reduce的过程:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
export PATH
max=10
for i in `seq 1 $max`
do
    echo "$i"
    cat links.txt pangerank.value > tmp.txt 
    cat tmp.txt |sort|python PageRankMapper.py |sort|python PageRankReducer.py >pangerank.value
done

这个代码不用改动就可以直接在hadoop上跑起来。调用hadoop命令:

#!/bin/bash

#sort
mapper=SortMapper.py
reducer=SortReducer.py
input="yours HDFS dir"/links.txt
input="yours HDFS dir"/pagerank.value
output="yours HDFS dir"/tmp.txt

hadoop jar contrib/streaming/hadoop-*streaming*.jar \
    -mapper /home/hduser/mapper.py \
    -reducer /home/hduser/reducer.py -file *.py\
    -input $input \
    -output $output


#Caculator PageRank
mapper=PageRankMapper.py
reducer=PageRankReducer.py
input="yours HDFS dir"/tmp.txt
output="yours HDFS dir"/pagerank.value

hadoop jar contrib/streaming/hadoop-*streaming*.jar \
    -mapper /home/hduser/mapper.py \
    -reducer /home/hduser/reducer.py -file *.py\
    -input $input \
    -output $output

第四步中带环的陷阱图,迭代40次,权值a取0.8,计算结果如下:

A            B                C                D
0.15    0.216666666667    0.416666666667    0.216666666667    
0.136666666666    0.176666666666    0.51    0.176666666666    
0.120666666666    0.157111111111    0.565111111111    0.157111111111    
0.112844444444    0.145022222222    0.597111111111    0.145022222222    
0.108008888889    0.138100740741    0.615789629629    0.138100740741    
0.105240296296    0.134042666667    0.62667437037    0.134042666667    
0.103617066667    0.131681145679    0.633020641975    0.131681145679    
0.102672458272    0.130303676049    0.636720189629    0.130303676049    
0.10212147042    0.129500792625    0.638876944329    0.129500792625    
0.10180031705    0.129032709162    0.640134264625    0.129032709162    
0.101613083665    0.128759834878    0.640867246578    0.128759834878    
0.101503933951    0.128600756262    0.641294553524    0.128600756262    
0.101440302505    0.128508018225    0.641543661044    0.128508018225    
0.10140320729    0.128453954625    0.64168888346    0.128453954625    
0.10138158185    0.128422437127    0.641773543895    0.128422437127    
0.101368974851    0.128404063344    0.64182289846    0.128404063344    
0.101361625338    0.128393351965    0.641851670733    0.128393351965    
0.101357340786    0.128387107543    0.641868444129    0.128387107543    
0.101354843017    0.128383467227    0.64187822253    0.128383467227    
0.101353386891    0.128381345029    0.641883923053    0.128381345029    
0.101352538012    0.128380107849    0.641887246292    0.128380107849    
0.10135204314    0.128379386609    0.641889183643    0.128379386609    
0.101351754644    0.128378966148    0.641890313062    0.128378966148    
0.101351586459    0.128378721031    0.641890971481    0.128378721031    
0.101351488412    0.128378578135    0.64189135532    0.128378578135    
0.101351431254    0.128378494831    0.641891579087    0.128378494831    
0.101351397932    0.128378446267    0.641891709536    0.128378446267    
0.101351378507    0.128378417955    0.641891785584    0.128378417955    
0.101351367182    0.128378401451    0.641891829918    0.128378401451    
0.10135136058    0.128378391829    0.641891855763    0.128378391829    
0.101351356732    0.12837838622    0.64189187083    0.12837838622    
0.101351354488    0.12837838295    0.641891879614    0.12837838295    
0.10135135318    0.128378381043    0.641891884735    0.128378381043    
0.101351352417    0.128378379932    0.64189188772    0.128378379932    
0.101351351973    0.128378379284    0.64189188946    0.128378379284    
0.101351351714    0.128378378906    0.641891890474    0.128378378906    
0.101351351562    0.128378378686    0.641891891065    0.128378378686    
0.101351351474    0.128378378558    0.64189189141    0.128378378558    
0.101351351423    0.128378378483    0.641891891611    0.128378378483    
0.101351351393    0.128378378439    0.641891891728    0.128378378439

可以看到pagerank值已经基本趋于稳定,并与第四步的分数表示一致。
2014.11.16注:上面写的map-reduce计算过程在多节点集群下有问题,在第二个map输入时,由于数据分片导致一部分结点的出链与pagerank值不在同一个块中,导致该结点对其他结点的贡献被忽略。单节点下不会出现这个问题。

标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则和常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化改进根据测试结果对系统进行优化和改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
在金融行业中,对信用风险的判断是核心环节之一,其结果对机构的信贷政策和风险控制策略有直接影响。本文将围绕如何借助机器学习方法,尤其是Sklearn工具包,建立用于判断信用状况的预测系统。文中将涵盖逻辑回归、支持向量机等常见方法,并通过实际操作流程进行说明。 一、机器学习基本概念 机器学习属于人工智能的子领域,其基本理念是通过数据自动学习规律,而非依赖人工设定规则。在信贷分析中,该技术可用于挖掘历史数据中的潜在规律,进而对未来的信用表现进行预测。 二、Sklearn工具包概述 Sklearn(Scikit-learn)是Python语言中广泛使用的机器学习模块,提供多种数据处理和建模功能。它简化了数据清洗、特征提取、模型构建、验证优化等流程,是数据科学项目中的常用工具。 三、逻辑回归模型 逻辑回归是一种常用于分类任务的线性模型,特别适用于二类问题。在信用评估中,该模型可用于判断借款人是否可能违约。其通过逻辑函数将输出映射为0到1之间的概率值,从而表示违约的可能性。 四、支持向量机模型 支持向量机是一种用于监督学习的算法,适用于数据维度高、样本量小的情况。在信用分析中,该方法能够通过寻找最佳分割面,区分违约非违约客户。通过选用不同核函数,可应对复杂的非线性关系,提升预测精度。 五、数据预处理步骤 在建模前,需对原始数据进行清理转换,包括处理缺失值、识别异常点、标准化数值、筛选有效特征等。对于信用评分,常见的输入变量包括收入水平、负债比例、信用历史记录、职业稳定性等。预处理有助于减少噪声干扰,增强模型的适应性。 六、模型构建验证 借助Sklearn,可以将数据集划分为训练集和测试集,并通过交叉验证调整参数以提升模型性能。常用评估指标包括准确率、召回率、F1值以及AUC-ROC曲线。在处理不平衡数据时,更应关注模型的召回率特异性。 七、集成学习方法 为提升模型预测能力,可采用集成策略,如结合多个模型的预测结果。这有助于降低单一模型的偏差方差,增强整体预测的稳定性准确性。 综上,基于机器学习的信用评估系统可通过Sklearn中的多种算法,结合合理的数据处理模型优化,实现对借款人信用状况的精准判断。在实际应用中,需持续调整模型以适应市场变化,保障预测结果的长期有效性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值