谈谈PageRank

闲来无事,整理一下算法。今天整理一下PageRank。

网上搜了搜感觉这篇文章还不错 
http://www.cnblogs.com/fengfenggirl/p/pagerank-introduction.html

本文对这篇文章进行修改加工,加入了一些自己的思想,后面代码实现用了Spark而不是原文的MR。

PageRank作用是给出网页的重要性,它的思想是这样的:

根据“民主投票”来确定的重要性,越重要的话语权越大,不断的投票获得新的重要值,直到收敛。(能力有限就不推导证明收敛了)

PageRank让网页通过链接去投票。如果网页A有三个链接B、C、D,其重要性为PRa,那么BCD这轮迭代分别从A获得了1/3 PRa的投票值。一个网页把所有获得的投票值累加起来,就是新的网页重要值。

还有一种解释就是概率的解释。我们最开始认为所有网页被访问的概率都是一样的,假设有M个网页,那么每个网页被访问的概率是1/M。一个网页如果有N个链接,那么从这个网页到一个被链接的网页的概率就是1/M*1/N。

但是迭代过程中有一个问题,就是没有出度的节点,最后会使每个网页被访问的概率都是零,用上面的说法解释就是,我进入了这个网页后我没有概率去访问任何网站。另一个问题就是出度wei1,自己链接自己,这样迭代下去会变成其他网页概率为零,只有自己是1,也就是进入这个网站后只能访问自己了。

模拟下人浏览网站,用户不一定非要点击页面中的链接进入下一个页面,还可以通过随机输入网址获得下一页。所以为了解决上诉两个问题,加入了一个?概率。

V′=?MV+(1??)e

其中M为网页链接关系矩阵,V为旧的PageRank值(就是重要性值),e为初始值。

下面是spark实现的pagerank,根据官网example代码修改

import org.apache.spark.sql.SparkSession
/*
我们的数据是这种格式的
url 链接的url
中间用空格隔开,每行两个url
**/
object SparkPageRank {
  def main(args: Array[String]) {
    if (args.length < 1) {
      System.err.println("Usage: SparkPageRank <file> <iter>")
      System.exit(1)
    }

    showWarning()
//spark 2.0版本
    val spark = SparkSession
      .builder
      .appName("SparkPageRank")
      .getOrCreate()

//    循环次数
    val iters = if (args.length > 1) args(1).toInt else 10
    val lines = spark.read.textFile(args(0)).rdd
//    生成(url,[a,b,c...])
    val links = lines.map{ s =>
      val parts = s.split("\\s+")
      (parts(0), parts(1))
    }.distinct().groupByKey().cache()//以后还用先存起来
//    生成rank表 (url,rank)初始值都为1.0,也就是e=[1,1,1,..]T
    var ranks = links.mapValues(v => 1.0)

    for (i <- 1 to iters) {
      val contribs = links.join(ranks).values.flatMap{ case (urls, rank) =>
        val size = urls.size
        urls.map(url => (url, rank / size))
      }
      //(url1,r1),(url1,r2),(url2,r3)....
      ranks =contribs.reduceByKey(_+_).mapValues(0.15 + 0.85 * _ )
    }
    val output = ranks.collect()
    output.foreach(tup => println(tup._1 + " has rank: " + tup._2 + "."))
    spark.stop()
  }
}

  

时间: 2024-10-28 20:16:51

谈谈PageRank的相关文章

通过提高PageRank / Domain权限,简化7种SEO流程

上涨的浪潮抬高了所有船只,这与增加站点权限类似.改善PageRank或域权限时,哪些因素受到影响?如何影响?在今天的Whiteboard星期五中,Cyrus详细介绍了七个SEO流程,这些投资可以通过在链接构建和增强权威方面的大量投资而变得更加容易. 单击上方的白板图像,在新选项卡中打开高分辨率版本! 视频转录 莫兹迷,您好!欢迎使用<星期五白板>.我是Cyrus Shepard.本周快速白板.我想谈谈链接. 我们知道在SEO中我们喜欢链接.每个人都想要链接.但为什么?链接为您做什么?他们为您带

Google”在垃圾中寻找黄金“——Page-Rank

GOOGLE"在垃圾中寻找黄金"--Page Rank GOOGLE"在垃圾中寻找黄金"--Page Rank 1.Google的低成本之道 ○不使用超级计算机,不使用存储(淘宝的去i,去e,去o之路) ○大量使用普通的PC服务器(去掉机箱,外设,硬盘),提供有冗余的集群服务 ○全世界多个数据中心,有些附带发电厂 ○运营商向Google倒付费 2.Google面对的数据和计算难题 大量的网页如何存储? Google的爬虫每天在全世界各个服务器里面爬到的很多网页,这些

谈谈对CAP定理的理解

谈谈对CAP定理的理解 CAP定理的常规解释是任何分布式系统只能在一致性(Consitency),可用性(Availability)和分区容忍性(Partition Tolerance)中三选二.这个解释很让人费解,笔者在看了一些文章后谈谈我对它的理解,还请斧正. 从问题出发 假设我们用一台服务器A对外提供存储服务,为了避免这台服务器宕机导致服务不可用,我们又在另外一台服务器B上运行了同样的存储服务.每次用户在往服务器A写入数据的时候,A都往服务器B上写一份,然后再返回客户端.一切都运行得很好,

谈谈我眼中的安徽企腾信息技术集成有限公司

在这里工作一段时间后,说说自己眼中的安徽企腾,我尽量本着客观的原则,不带任何主观因素与感情色彩. 首先,先说说规模,所谓的分成售前与售后,其实就是虚张声势,售前不过是一些笔记本的售后维修,售后与售前基本上没什么关系.而售后,销售加上技术,最多时也不过7个人.平时一些项目,大一点,一些不能做的直接外包出去,小一点的项目,所谓的"施工队",就是全体总动员. 公司里做了好几块业务,其中一块是飕飕商用路由,刚开始,想的是多么好,但是最后却被浇了一盆冷水,市场根本不接受,唯一做了一家宾馆,还是连

谈谈JS里的{ }大括号和[ ]中括号的用法

谈谈JS里的{ }大括号和[ ]中括号的用法,理解后就可以看懂JSON结构了. 一.{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数. 如:var LangShen = {"Name":"Langshen","AGE":"28"}; 上面声明了一个名为"LangShen"的对象,多个属性或函数用,(逗号)隔开,因为是对象的属性, 所以访问时,应该用.(点)来层层访问:LangShe

《谈谈认同》这个文章有点晦涩 写的不太好

认同是一个人主观能动性的一个影响因素.至于人的主观能动性还有什么影响因素,先不讨论,而且我也没学过也没想过.在可选择事物的主观能动性上,认同应该算最基本也是影响最大的了.回到主题,我们来谈谈认同.        认同有三个表现:第一.口头认同.第二.行动认同.第三.心理认同.简单的理解,就是口头认同只说认同,但不做,事前一套事后一套.行动认同就是说也说了,干也干了,但心里不这样想.心理认同就是口手心合一.但我们都清楚认同其实从本质上讲只有一种,就是心理认同.只有心理认同才是真正的认同.但是在工作

谈谈vector容器的三种遍历方法

说明:本文仅供学习交流,转载请标明出处,欢迎转载! vector容器是最简单的顺序容器,其使用方法类似于数组,实际上vector的底层实现就是采用动态数组.在编写程序的过程中,常常会变量容器中的元素,那么如何遍历这些元素呢?本文给出三种遍历方法. 方法一:采用下标遍历 由于vector容器就是对一个动态数组的包装,所以在vector容器的内部,重载了[]运算符,函数原型为:reference operator [] (size_type n);所以我们可以采用类似于数组的方式来访问vector容

谈谈怎么使用JSONP

JSONP是什么,其实它是目前主流的实现跨域通信的解决方案. 因为我们都知道,在我们使用ajax去发起HTTP请求的时候,是不可以跨域的.也就是不能在不同域名下.端口等去请求.如果我们强行这么做的话,它是会报错. 这里举个例子. function createXHR() { var xhr = new XMLHttpRequest(); return xhr; } function ajax(url) { var xhr = createXHR(); xhr.onreadystatechange

你读到了什么:谈谈阅读的空与实

開始写点文字后,有些文章有人留言评论说:「都是些空话,正确的废话」,而有些文章有人又会留言评论说:「就喜欢这种.满满的干货.实在」. 究竟什么是空还是实蛮让我困惑的,思考了一段时间后今天就想谈谈我从阅读文章中究竟读到了些什么? 不管是别人评价是空话还是实在,于写作者我而言仅仅负责将自己思考后的观点清晰的表达,而至于是用「干货」还是「湿货」的形式来表达事实上取决于支撑观点的内容本身. 代入去想我知道评论说文章太空的人本身对阅读的期待是能从中收获实用甚或立马用的上的东西.凡是怀有相似期待的读者多半是