PageRank学习

简介: 喜欢手写学习,记忆深刻(字丑勿喷!)。  计算过程的代码如下: public class PageRank { private static double m[][]={ { 0 , 0.

喜欢手写学习,记忆深刻(字丑勿喷!)。

 计算过程的代码如下:

public class PageRank
{
	private static double m[][]={
		{   0        , 0.5 , 1 ,  0 },
		{0.333333333 ,  0  , 0 , 0.5},
		{0.333333333 ,  0  , 0 , 0.5},
		{0.333333333 , 0.5 , 0 ,  0 }
	};
	private static double v[]={0.25,0.25,0.25,0.25};
	private static double v1[]={0,0,0,0};
	public static void main(String[] argv)
	{
		for(int iterater=0;iterater<1000;iterater++)
		{
			for(int i=0;i<4;i++)
			{
				for(int j=0;j<4;j++)
				{
					v1[i]+=m[i][j]*v[j];
				}
			}
			for(int k=0;k<4;k++)
			{
				v[k]=v1[k];
				v1[k]=0;
			}
		}
		for(int k=0;k<4;k++)
		{
			System.out.println(v[k]);
		}
	}
}

  上面使用的图是一个没有太大缺陷的图,其实PageRank中海油很多问题需要处理,主要问题有:

1.终止点问题

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

  • 图是强连通的,即从任意网页可以到达其他任意网页:

  互联网上的网页不满足强连通的特性,因为有一些网页不指向任何网页,如果按照上面的计算,上网者到达这样的网页后便走投无路、四顾茫然,导致前面累计得到的转移概率被清零,这样下去,最终的得到的概率分布向量所有元素几乎都为0。假设我们把上面图中C到A的链接丢掉,C变成了一个终止点,得到下面这个图:

         

  对应的转移矩阵为:

  

  连续迭代下去,最终所有元素都为0:  

  

代码如下:

public class PageRank
{
	private static double m[][]={
		{   0        , 0.5 , 0 ,  0 },
		{0.333333333 ,  0  , 0 , 0.5},
		{0.333333333 ,  0  , 0 , 0.5},
		{0.333333333 , 0.5 , 0 ,  0 }//第三列全为0
	};
	private static double v[]={0.25,0.25,0.25,0.25};
	private static double v1[]={0,0,0,0};
	public static void main(String[] argv)
	{
		for(int iterater=0;iterater<1000;iterater++)
		{
			for(int i=0;i<4;i++)
			{
				for(int j=0;j<4;j++)
				{
					v1[i]+=m[i][j]*v[j];
				}
			}
			for(int k=0;k<4;k++)
			{
				v[k]=v1[k];
				v1[k]=0;
			}
		}
		for(int k=0;k<4;k++)
		{
			System.out.println(v[k]);
		}
	}
}

 2.陷阱问题

  另外一个问题就是陷阱问题,即有些网页不存在指向其他网页的链接,但存在指向自己的链接。比如下面这个图:

        

  上网者跑到C网页后,就像跳进了陷阱,陷入了漩涡,再也不能从C中出来,将最终导致概率分布值全部转移到C上来,这使得其他网页的概率分布值为0,从而整个网页排名就失去了意义。如果按照上面图对应的转移矩阵为: 

        

  不断的迭代下去,就变成了这样:

    

代码如下:

public class PageRank
{
	private static double m[][]={
		{   0        , 0.5 , 0 ,  0 },
		{0.333333333 ,  0  , 0 , 0.5},
		{0.333333333 ,  0  , 1 , 0.5},//此行第三列为1
		{0.333333333 , 0.5 , 0 ,  0 }
	};
	private static double v[]={0.25,0.25,0.25,0.25};
	private static double v1[]={0,0,0,0};
	public static void main(String[] argv)
	{
		for(int iterater=0;iterater<1000;iterater++)
		{
			for(int i=0;i<4;i++)
			{
				for(int j=0;j<4;j++)
				{
					v1[i]+=m[i][j]*v[j];
				}
			}
			for(int k=0;k<4;k++)
			{
				v[k]=v1[k];
				v1[k]=0;
			}
		}
		for(int k=0;k<4;k++)
		{
			System.out.println(v[k]);
		}
	}
}

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

上面过程,我们忽略了一个问题,那就是上网者是一个悠闲的上网者,而不是一个愚蠢的上网者,我们的上网者是聪明而悠闲,他悠闲,漫无目的,总是随机的选择网页,他聪明,在走到一个终结网页或者一个陷阱网页(比如两个示例中的C),不会傻傻的干着急,他会在浏览器的地址随机输入一个地址,当然这个地址可能又是原来的网页,但这里给了他一个逃离的机会,让他离开这万丈深渊。模拟聪明而又悠闲的上网者,对算法进行改进,每一步,上网者可能都不想看当前网页了,不看当前网页也就不会点击上面的连接,而上悄悄地在地址栏输入另外一个地址,而在地址栏输入而跳转到各个网页的概率是1/n。假设上网者每一步查看当前网页的概率为a,那么他从浏览器地址栏跳转的概率为(1-a),于是原来的迭代公式转化为:

  现在我们来计算带陷阱的网页图的概率分布:

 

  重复迭代下去,得到:

  可以看到C虽然占了很大一部分pagerank值,但其他网页页获得的一些值,因此C的链接结构,它的权重确实应该会大些。

代码如下:

public class PageRank
{
	private static double m[][]={
		{   0        , 0.5 , 0 ,  0 },
		{0.333333333 ,  0  , 0 , 0.5},
		{0.333333333 ,  0  , 1 , 0.5},
		{0.333333333 , 0.5 , 0 ,  0 }
	};
	private static double v[]={0.25,0.25,0.25,0.25};
	private static double v1[]={0,0,0,0};
	public static void main(String[] argv)
	{
		for(int iterater=0;iterater<1000;iterater++)
		{
			for(int i=0;i<4;i++)
			{
				for(int j=0;j<4;j++)
				{
					v1[i]+=m[i][j]*v[j];
				}
			}
			for(int k=0;k<4;k++)
			{
				v[k]=0.8*v1[k]+0.2*0.25;//此处0.2乘的一直都是v[]的初始值
				v1[k]=0;
			}
		}
		for(int k=0;k<4;k++)
		{
			System.out.println(v[k]);
		}
	}
}

  

目录
相关文章
|
6月前
|
算法 索引 Python
使用Python实现PageRank计算
使用Python实现PageRank计算
110 0
|
5月前
|
数据采集 自然语言处理 搜索推荐
心得经验总结:浅析PageRank算法
心得经验总结:浅析PageRank算法
53 0
|
机器学习/深度学习 自然语言处理 算法
Topical PageRank(TPR)论文解读
现基于图的关键字抽取算法都是通过单个单词的在网络中的随机游走,来得出每个单词的重要性得分。文档和单词能被混合语义主题呈现,作者提出将传统的随机游走算法分解成多个不同主题的随机游走。作者建立了一个Topical PageRank算法在不同主题图上进行随机游走
112 0
|
索引
LeetCode 336. Palindrome Pairs
给定一组唯一的单词, 找出所有不同 的索引对(i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串。
138 0
LeetCode 336. Palindrome Pairs
|
算法 搜索推荐 SEO
PageRank算法原理与实现
PageRank算法原理与实现
319 0
PageRank算法原理与实现
|
并行计算 算法 搜索推荐
你管这叫 PageRank 算法
算法简介 核心思想 算法原理 算法分析 算法改进
你管这叫 PageRank 算法
【LeetCode】Palindrome Pairs(336)
  Given a list of unique words. Find all pairs of distinct indices (i, j) in the given list, so that the concatenation of the two words, i.e. words[i] + words[j] is a   palindrome.
113 0
|
机器学习/深度学习 算法框架/工具 TensorFlow
(转) AdversarialNetsPapers
  本文转自:https://github.com/zhangqianhui/AdversarialNetsPapers AdversarialNetsPapers The classical Papers about adversarial nets The First pap...
|
机器学习/深度学习 算法 数据挖掘
Spark-K-Means算法
机器学习算法大体分为三类:监督学习(supervised learning)、无监督学习(unsupervised learning)和半监督学习(semi-supervised learning)。
1241 0
|
算法 搜索推荐
PageRank算法
PageRank,网页排名,又称网页级别,传说中是PageRank算法拯救了谷歌,它是根据页面之间的超链接计算的技术,作为网页排名的要素之一。它通过网络浩瀚的超链接关系来确定一个页面的等级。Google把从A页面到B页面的链接解释为A页面给B页面投票,根据投票的来源(甚至来源的来源,即链接到A页面的页面)和投票目标的等级来决定新的等级。
1167 0