Spark 系列(六)Spark

Stella981
• 阅读 584

写在前面: 我是「nicedays」,一枚喜爱做特效,听音乐,分享技术大数据开发猿。这名字是来自world order乐队的一首HAVE A NICE DAY。如今,走到现在很多坎坷和不顺,如今终于明白nice day是需要自己赋予的。
白驹过隙,时光荏苒,珍惜当下~~
写博客一方面是对自己学习的一点点总结及记录,另一方面则是希望能够帮助更多对大数据感兴趣的朋友。如果你也对 大数据与机器学习感兴趣,可以关注我的动态 https://blog.csdn.net/qq_35050438,让我们一起挖掘数据与人工智能的价值~

Spark GraphX 图算法:

一:PageRank模型:

每个网页为一个点

A到B的链接抽象为一条有向边

整张网页链接抽象成一份有向图

Spark 系列(六)Spark

  • 接下来我们通过一个转移矩阵来表示用户从页面i到页面j的可能性

M = [ 0 1 2 0 1 2 1 3 0 0 1 2 1 3 1 2 0 0 1 3 0 1 0 ] M = \begin{bmatrix}0 & \frac{1}{2} & 0 & \frac{1}{2} \\\frac{1}{3} & 0 & 0 & \frac{1}{2} \\\frac{1}{3} & \frac{1}{2} & 0 & 0 \\\frac{1}{3} & 0 & 1 & 0\end{bmatrix} M=⎣⎢⎢⎡​031​31​31​​21​021​0​0001​21​21​00​⎦⎥⎥⎤​

  • 这个矩阵的每一列代表一个具体网页的出链,简单地说就是当前网页向其他网页的链接,第一列为A-A,A-B,A-C,A-D
  • 矩阵的每一行代表一个具体网页的入链,简单地说就是其他网页向当前网页的链接,第一行为A-A,B-A,C-A,D-A

Rank值:

不加权重的话,本意是当前页面点击一次后停留在自己页面的概率

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

P 0 = [ 1 4 1 4 1 4 1 4 ] T P_0 = \begin{bmatrix}\frac{1}{4} & \frac{1}{4} & \frac{1}{4} & \frac{1}{4} \\\end{bmatrix}^T P0​=[41​​41​​41​​41​​]T

现在我们需要求根据当他点击一次继续停留在当前页面的概率

如果初始状态为B页面来说,当他点击一次继续停留在A页面的概率我们应该这样考虑:

  • 情况一:B页面是从A走到B的,同时点击一次继续留在该页面,

    两个事件必须同时发生,第一个事件发生概率为1/3,第二个事件发生概率为1/4
    P ( A B ) = P ( A ) P ( B ) P(AB) = P(A)P(B) P(AB)=P(A)P(B)

    所以情况一概率为1/12

  • 情况二:B页面是从D走到B的,同时点击一次继续留在该页面,

    两个事件必须同时发生,第一个事件发生概率为1/2,第二个事件发生概率为1/4,同理情况二概率为1/8

总概率为两个情况之和:5/24

所有的页面停留概率可以用矩阵相乘来得到:
P 1 = M ∗ P 0 = [ 0 1 2 0 1 2 1 3 0 0 1 2 1 3 1 2 0 0 1 3 0 1 0 ] ∗ [ 1 4 1 4 1 4 1 4 ] = [ 1 4 5 24 5 24 1 3 ] P_1 = M*P_0=\begin{bmatrix}0 & \frac{1}{2} & 0 & \frac{1}{2} \\\frac{1}{3} & 0 & 0 & \frac{1}{2} \\\frac{1}{3} & \frac{1}{2} & 0 & 0 \\\frac{1}{3} & 0 & 1 & 0\end{bmatrix}*\begin{bmatrix}\frac{1}{4} \\ \frac{1}{4} \\ \frac{1}{4} \\ \frac{1}{4} \\ \end{bmatrix}=\begin{bmatrix}\frac{1}{4} \\ \frac{5}{24} \\ \frac{5}{24} \\ \frac{1}{3} \\ \end{bmatrix} P1​=M∗P0​=⎣⎢⎢⎡​031​31​31​​21​021​0​0001​21​21​00​⎦⎥⎥⎤​∗⎣⎢⎢⎡​41​41​41​41​​⎦⎥⎥⎤​=⎣⎢⎢⎡​41​245​245​31​​⎦⎥⎥⎤​
每乘以1/4的向量相当于我计算每点击一次继续停留在该页面的概率,在不断点击迭代后,由于马尔科夫性,最终会收敛到一个值。

二:终止点问题:

先前所举的例子是一个理想状态:

假设所有网页组成的有向图是强连通的,即从一个网页可以到达任意网页。但实际的网络链接环境没有这么理想有一些网页不指向任何网页,或不存在指向自己的链接。
Spark 系列(六)Spark

如果存在没有出度的点,那么当我们不断迭代上面的矩阵方程时,最终一定会收敛于0,也就是最后大家都会跳到那个没有出度的点上。

三:陷阱问题:

陷阱指的是只有指向自身链接的网页

Spark 系列(六)Spark

上网者浏览到 C 网页将陷入无休止的循环之中
M = [ 0 1 2 0 0 1 3 0 0 1 2 1 3 0 1 1 2 1 3 1 2 0 0 ] M = \begin{bmatrix}0 & \frac{1}{2} & 0 & 0 \\\frac{1}{3} & 0 & 0 & \frac{1}{2} \\\frac{1}{3} & 0 & 1 & \frac{1}{2} \\\frac{1}{3} & \frac{1}{2} & 0 & 0\end{bmatrix} M=⎣⎢⎢⎡​031​31​31​​21​0021​​0010​021​21​0​⎦⎥⎥⎤​
根据公式
P n = M ⋅ P n − 1 = M n ⋅ P 0 P_n=M⋅P_{n−1}=M^n⋅P_0 Pn​=M⋅Pn−1​=Mn⋅P0​
迭代计算出 PR 值向量。

四:阻尼系数:

我们可以通过阻尼系数来解决陷阱问题和孤立点问题了。

随即浏览模型:

假定一个上网者从一个随机的网页开始浏览,此时有两种选择:

  • 通过点击当前页面的其他链接开始下一次浏览。
  • 通过在浏览器的地址栏输入新的地址以开启一个新的网页。

由此,上网者从点击链接来跳转的概率变为d,此时PageRank模型变为:在每一个页面,用户都有d概率点击链接,1-d概率输入地址栏跳转,而输入地址栏跳转到任一页面的概率为1/N(N为页面)。
P n = d ∗ [ 0 1 2 0 1 2 1 3 0 0 1 2 1 3 1 2 0 0 1 3 0 1 0 ] ∗ [ 1 4 1 4 1 4 1 4 ] + ( 1 − d ) ∗ [ 1 4 1 4 1 4 1 4 ] P_n = d*\begin{bmatrix}0 & \frac{1}{2} & 0 & \frac{1}{2} \\\frac{1}{3} & 0 & 0 & \frac{1}{2} \\\frac{1}{3} & \frac{1}{2} & 0 & 0 \\\frac{1}{3} & 0 & 1 & 0\end{bmatrix}*\begin{bmatrix}\frac{1}{4} \\ \frac{1}{4} \\ \frac{1}{4} \\ \frac{1}{4} \\ \end{bmatrix} + (1-d)*\begin{bmatrix}\frac{1}{4} \\ \frac{1}{4} \\ \frac{1}{4} \\ \frac{1}{4} \\ \end{bmatrix} Pn​=d∗⎣⎢⎢⎡​031​31​31​​21​021​0​0001​21​21​00​⎦⎥⎥⎤​∗⎣⎢⎢⎡​41​41​41​41​​⎦⎥⎥⎤​+(1−d)∗⎣⎢⎢⎡​41​41​41​41​​⎦⎥⎥⎤​

而阻尼系数d我们经过实验测算一般归纳为0.85

五:PageRank in GraphX

  • PageRank(PR)算法
    • 用于评估网页链接的质量和数量,以确定该网页的重要性和权威性的相对分数,范围为0-10
    • 从本质上讲,PageRank是找出图中顶点(网页链接)的重要性
    • GraphX提供了PageRank API用于计算图的PageRank

Spark实现PageRank:

import org.apache.spark.HashPartitioner
 
val links = sc.parallelize(List(("A",List("B","C")),("B",List("A","C")),("C",List("A","B","D")),("D",List("C")))).partitionBy(new HashPartitioner(100)).persist()
 
var ranks=links.mapValues(v=>1.0)
 
for (i <- 0 until 10) {
val contributions=links.join(ranks).flatMap {
case (pageId,(links,rank)) => links.map(dest=>(dest,rank/links.size))
}
ranks=contributions.reduceByKey((x,y)=>x+y).mapValues(v=>0.15+0.85*v)
}
 
ranks.sortByKey().collect()

PageRank 算法缺点

  • 主题漂移问题:PageRank 算法仅利用网络的链接结构,无法判断网页内容上的相似性;且算法根据向外链接平均分配权值使得主题不相关的网页获得与主题相关的网页同样的重视度,出现主题漂移。
  • 没有过滤广告链接和功能链接:例如常见的“分享到微博”,这些链接通常没有什么实际价值,前者链接到广告页面,后者常常链接到某个社交网站首页。
  • 对新网页不友好:一个新网页的入链相对较少,即便它的内容质量很高,但要成为一个高 PR 值的页面仍需要很长时间的推广。
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Java修道之路,问鼎巅峰,我辈代码修仙法力齐天
<center<fontcolor00FF7Fsize5face"黑体"代码尽头谁为峰,一见秃头道成空。</font<center<fontcolor00FF00size5face"黑体"编程修真路破折,一步一劫渡飞升。</font众所周知,编程修真有八大境界:1.Javase练气筑基2.数据库结丹3.web前端元婴4.Jav
Wesley13 Wesley13
3年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这