Google核心技术之——PageRank算法scala实现
PageRank算法简述
常言道,看一个人怎样,看他有什么朋友就知道了。也就是说,一个人有着越多牛X朋友的人,他是牛X的概率就越大。将这个知识迁移到网页上就是“被越多优质的网页所指的网页,它是优质的概率就越大”。PageRank是Google创始人提出来的,算法的发展也经历了很多次优化。至于原理这边就不累赘了,同学们可以自行谷歌~~
工程化实现
1.输入数据
2,1 2,4 3,2 3,5 4,1 5,3 6,7
数据说明:链出页面,链入页面
2.每步的迭代公式
S(Vi)是网页i的中重要性(权重)。d是阻尼系数,一般设置为0.85。In(Vi)是存在指向网页i的链接的网页集合。Out(Vj)是网页j中的链接存在的链接指向的网页的集合。|Out(Vj)|是集合中网页的个数。
3.数据清洗
所有集合
[1,2,3,4,5,6,7]
初始评分 (可以自定义,这边设置为1)
[(1,1),(2,1),(3,1),(4,1),(5,1)...]
清洗结果
[(2,<1,4>),(3,<2,5>),(4,<1>),(5,<3>)...] (1)
迭代过程
def main(args: Array[String]): Unit = {
val sc = new SparkContext(new SparkConf().setMaster("local[1]").setAppName("pageRank"))
val file = sc.textFile("D:/HDFS/Input/pageRank.txt").persist(StorageLevel.MEMORY_ONLY_SER)
val initFile = file.flatMap { _.split(",").toList }
//<2, 1> <2, 4> <3, 2>.... (1)
val rankFile = file.map { line =>
val token = line.split(",")
(token(0), token(1))
}.distinct()
file.unpersist(true);
//<2, 1f> <3, 1f> <4, 1f>...
var init = initFile.distinct().map { (_, 1f) }
var map = sc.broadcast(init.collectAsMap())
//循环遍历 迭代次数
val num = 1
for (i <- 1 to num) {
init = rankFile.aggregateByKey(List[String]())(_ :+ _, _ ++ _).flatMap(calculate(_, map.value)).reduceByKey(_ + _)
.rightOuterJoin(init).map(x => (x._1, if (x._2._1.isDefined == true) x._2._1.get else 0f))
if (i != num) {
map = sc.broadcast(init.collectAsMap())
}
}
init.collect().foreach(println)
}
def calculate(a: (String, List[String]), b: scala.collection.Map[String, Float]): ArrayBuffer[(String, Float)] = {
val array = ArrayBuffer[(String, Float)]()
for (i <- 0 to (a._2.size - 1)) {
array += ((a._2(i), b.get(a._2(i)).get / a._2.size))
}
array
}
核心步骤
1. (1) ===> <2, [1, 4]>
2. <2, [1, 4]> ===> <1, 上次迭代1的分数 / [1, 4].size>
3. reduceByKey
4. rightOuterJoin(init) 保证无出链的不丢失
迭代结果
num = 1 (4,0.5) (7,1.0) (5,0.5) (6,0.0) (2,0.5) (3,1.0) (1,1.5)
注意:公式中阻尼系数d在算法初始阶段是没有的,上述公式中d设置为1此处会发现6的权重为0,就出现了孤立页面,这时候便引进了阻尼系数d,d一般设值为0.85
修改之后公式(0.15f + x._2._1.get * 0.85f),其意义是,在任意时刻,用户到达某页面后并继续向后浏览的概率。 1- q= 0.15就是用户停止点击,随机跳到新URL的概率)的算法被用到了所有页面上,估算页面可能被上网者放入书签的概率。迭代一次结果为
(4,0.57500005) (7,1.0) (5,0.57500005) (6,0.15) (2,0.57500005) (3,1.0) (1,1.4250001)
迭代十次
(4,0.2610117) (7,1.0) (5,0.2610117) (6,0.15) (2,0.2610117) (3,1.0) (1,16.99974)
随着每一轮的计算进行,网页当前的PageRank值会不断得到更新。设置一个阈值,通过比较迭代前后的平方差是否接近阈值来判断迭代是否停止。
总结
已经完成了pageRank算法的scala代码实现工程,对pageRank算法的认知也更加深刻。算法么,都存在自身的优缺点,pageRank算法的它与查询无关,也就是说无论是谁在百度或者谷歌无搜索关键词返回结果应该是一样的,但是有了搜索词,会在整个排序中取出部分结果重新排序展示给用户,这些就是搜索引擎所做的事情了。pageRank算法设计思想类似于itembase协同过滤算法中M/N的设计,大多数人认为对的通常都是对的。搜索推荐真是一家人!!!
来源:http://blog.csdn.net/pztyz314151/
- 使用Docker 1.12.x构建多容器Web应用程序
- 基于 vue2 + vuex 构建一个具有 45 个页面的大型单页面应用
- 深度解剖dubbo源码
- .NET Core采用的全新配置系统[6]: 深入了解三种针对文件(JSON、XML与INI)的配置源
- 基于 vue2 构建和后台真实交互的 管理系统
- ASP.NET MVC的Model元数据与Model模板:模板的获取与执行策略
- python3.6抓取100知乎用户头像详解(四)
- 从运营商小广告到HTTPS
- .NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]
- 区块链:为什么它不仅仅是比特币?
- Java Mail(二):JavaMail介绍及发送一封简单邮件
- ASP.NET MVC Controller激活系统详解:总体设计
- .NET Core采用的全新配置系统[7]: 将配置保存在数据库中
- Selenium3+Python3环境部署
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浅谈在进行jsp页面编程时,路径问题的解决(绝对路径与相对路径)
- 浅谈springMVC中,中文乱码的显示问题(持续更新)
- 数据库的优化方法,一般人我不告诉他(建议收藏)
- idea 远程调试
- 嘘!高效快速的刷访问量(偷偷收藏)
- 进行JDBC操作时,连接参数的配置(附DBUtil工具类)
- JavaEE中,考勤(签到签退)功能的实现
- HTTP协议详解,浏览器和服务器交互过程详解
- 京东网页(动态)搭建,利用jquery实现
- 京东购物车(动态)网页搭建,利用JavaScript实现
- 你不知道的 TypeScript 泛型(万字长文,建议收藏)
- JavaScript中的函数、对象
- 京东购物车网页(静态)搭建
- MyBatis注解详解
- MyBatis完整环境搭建步骤