大数据基础之SparkGraphX——Spark PageRank算法,包你能看懂

PageRank的概念

  PageRank,网页排名, 是一种由根据网页之间相互的超链接计算的技术,而作为网页排名的要素之一, 它由Larry Page 和 Sergey Brin在20世纪90年代后期发明,并以拉里·佩吉(Larry Page)之姓来命名。
  PageRank是Google专有的算法,用于衡量特定网页相对于搜索引擎索引中的其他网页而言的重要程度。PageRank算法计算每一个网页的PageRank值,然后根据这个值的大小对网页的重要性进行排序。该算法可以用于对网页进行排序,当然,也可以用于排序科技文章或社交网络中有影响的用户等。

算法原理

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

PageRank模型

我们将Web作如下抽象:

  • 将每个网页抽象成一个节点
  • 如果一个页面 A 有链接直接链向 B,则存在一条有向边从 A 到 B。
    因此就形成了一张有向图
    在这里插入图片描述
    此时,我们需要用一种合适的数据结构来表示页面以及页面间的连接关系。假设当一个用户停留在某页面时,跳转到它所链接的所有页面的概率是相同的。例如,上图中 A 页面链向 B、C、D,所以用户从 A 页面跳转到 B、C、D 的概率各为 1/3。设一共有 N 个网页,则可以组织这样一个 N 维矩阵:其中 i 行 j 列的值表示用户从页面 j 跳转到页面 i 的概率。这样的一个矩阵叫做转移矩阵
    在这里插入图片描述
    观察矩阵可以发现:
  • 矩阵的每一列代表一个具体网页的出链,简单的来说就是当前网页向其他网页的链接
  • 矩阵的每一行代表一个具体网页的入链,简单来说就是其他网页向当前网页的链接

PageRank初始化

初始时用户访问每个页面的概率均等,假设一共有 N 个网页,每个网页的初始 PR 值 = 1 / N。我们可以将这些网页的初始 PR 值保存到一个向量中。
在这里插入图片描述

  • 对于页面A来说,有B、D页面链向他,那么A的PR值(PageRank值)将是B、D页面的PR值之和
                     PR(A)=PR(B)+PR(D)
  • 由于页面 B 也有链接到页面 C,一个页面不能投票 2 次,所以 B 给每个页面半票。同样的,D 投出的票也只有 1/2 算到了 A 的 PageRank 上。
    在这里插入图片描述
    所以A的PageRank值的计算公式可以统一形式:
    在这里插入图片描述
    我们再把上面的公式简化一下,将其推广到更大的范围。
    在这里插入图片描述
    这样,我们就可以计算任意一个网页的 pagerank 值。那么要怎么计算呢?观察 PR(A) 的计算公式我们可以发现,PR(A) 实际上等于转移矩阵 M 的第一行乘上初始 PR 值。我们回想一下转移矩阵的性质,每一行表示其他网页链接到当前网页的概率,这一行的概率指相加实际上就是我们上述推导的公式。所以,如果要同时计算 Web 上的所有页面,我们可以直接计算转移矩阵 M 每一行的概率值累加和。
    在这里插入图片描述
    由于我们计算的是概率值,且初始每个页面的概率都相等,因此我们可求出在经过上述出链和入链后,各个页面的停留概率。
    在这里插入图片描述

终止点问题

先前所举的例子是一个理想状态:假设所有网页组成的有向图是强连通的,即从一个网页可以到达任意网页。但实际的网络链接环境没有这么理想,有一些网页不指向任何网页,或不存在指向自己的链接。
在这里插入图片描述
根据上图我们可以写出转移矩阵 M:
在这里插入图片描述
然后根据以上公式迭代计算出PR值
在这里插入图片描述
可以看到,经过多次跳转之后,所有网页的 PR 值都是 0,这样的计算结果是无意义的。为什么会这样?因为转移矩阵 M 的第 3 列全为 0,这是导致迭代结果最终归零的“罪魁祸首”。
在这里插入图片描述
【解决方案】:当访问到终止点 C 而“走投无路”时,以等概率随机跳转到下一个网页,从而开启一次新的访问。

  • 改造终止点 C,使它能够等概率地游走到网络中的所有页面,即添加从 C 到包括它本身的所有页面的链接。
  • 在上例中就是将转移矩阵 M 的第三列的每一项改为 1/4。这样改造后,每一个节点都有出链,相应的 M 的每一列的列累加和都为 1。

陷阱问题:

是指有些网页不存在指向其他网页的链接,但存在指向自己的链接。比如下面这个图:
在这里插入图片描述
这种情况下,PageRank算法不断迭代会导致概率分布值全部转移到c网页上,这使得其他网页的概率分布值为0,从而整个网页排名就失去了意义。如果按照上面图则对应的转移矩阵M为:
在这里插入图片描述
不断迭代,最终得到如下结果:
在这里插入图片描述

完整PageRank算法

为了解决终止点问题和陷阱问题,下面需要对算法进行改进。假设选取下一个跳转页面时,既不选当前页面,也不选当前网页上的其他链接,而是以一定概率跳转到其他不相关网页,那么上面两个问题就能得到很好的解决,这就是完整PageRank算法思想。

假设跳转到当前页面(包括当前页面上的链接)的概率为a(也称为基尼系数),那么跳转到其他页面概率为(1−a),进一步假设每个页面被访问的概率相同都是1/n,于是原来的迭代公式转化为:
在这里插入图片描述
假设α的值为0.85,e是网页数目的倒数,共4个网页,所以e等于1/4。现在计算有陷阱的网页的概率分布:
在这里插入图片描述
利用上面公式继续迭代下去,直到收敛,得到最终rank值。

案例分析1:

找出用户社交网络中最重要的用户

val spark = SparkSession.builder().appName("mytest").master("local[1]").getOrCreate()
    val tweeters = Array((1L, ("Alice", 28)), (2L, ("Bob", 27)), (3L, ("Charlie", 65)), (4L, ("David", 42)), (5L, ("Ed", 55)), (6L, ("Fran", 50)))
    val vertexRDD: RDD[(Long, (String, Int))] = spark.sparkContext.parallelize(tweeters)

    val followRelations = Array(Edge[Int](2L, 1L, 7), Edge[Int](2L, 4L, 2), Edge[Int](3L, 2L, 4),  Edge[Int](3L, 6L, 3), Edge[Int](4L, 1L, 1), Edge[Int](5L, 2L, 2), Edge[Int](5L, 3L, 8), Edge[Int](5L, 6L, 3))

    val edges = spark.sparkContext.parallelize(followRelations)

    val grap = Graph(vertexRDD,edges)
    val cc = grap.pageRank(0.001)            //无限迭代后的收敛值
    cc.vertices.sortBy(-_._2).foreach(println)

案例分析2:

数据格式:

在这里插入图片描述

在这里插入图片描述
求每个点的PageRank值
代码实现:

val conf = new SparkConf().setMaster("local[2]").setAppName("mytest")
    val sc = SparkContext.getOrCreate(conf)

    val graph = GraphLoader.edgeListFile(sc,"file:///d:/edges.txt")

    val ranks = graph.pageRank(0.0001).vertices

    val usrs = sc.textFile("file:///d:/vertext.txt").map(x=>{
      val field =  x.split(",")
      (field(0).toLong,field(1))
    })


    val rankByUsr = usrs.join(ranks).map({
      case(id,(username,rank))=>(username,rank)
    }).foreach(println)

结果展示:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值