PageRank让链接来"投票"

一个页面的“得票数”由所有链向它的页面的重要性来决定,到一个页面的超链接相当于对该页投一票。一个页面的PageRank是由所有链向它的页面(“链入页面”)的重要性经过递归算法得到的。一个有较多链入的页面会有较高的等级,相反如果一个页面没有任何链入页面,那么它没有等级。
  2005年初,Google为网页链接推出一项新属性nofollow,使得网站管理员和网站作者可以做出一些Google不计票的链接,也就是说这些链接不算作"投票"。nofollow的设置可以抵制评论垃圾。

假设一个由4个页面组成的小团体:ABCD。如果所有页面都链向A,那么APR(PageRank)值将是BCD的Pagerank总和。

继续假设B也有链接到C,并且D也有链接到包括A的3个页面。一个页面不能投票2次。所以B给每个页面半票。以同样的逻辑,D投出的票只有三分之一算到了A的PageRank上。

换句话说,根据链出总数平分一个页面的PR值。

最后,所有这些被换算为一个百分比再乘上一个系数。由于“没有向外链接的页面”传递出去的PageRank会是0,所以,Google通过数学系统给了每个页面一个最小值:

说明:在Sergey Brin和Lawrence Page的1998年原文中给每一个页面设定的最小值是1-d,而不是这里的

(1-d)/N。 所以一个页面的PageRank是由其他页面的PageRank计算得到。Google不断的重复计算每个页面的PageRank。如果给每个页面一个随机PageRank值(非0),那么经过不断的重复计算,这些页面的PR值会趋向于稳定,也就是收敛的状态。这就是搜索引擎使用它的原因。

实验数据a.txt是小的随机生成的图(图中没有终止点)。节点个数n=1000,边数m=8192

该图有一个1000条边构成的有向环(遍历了所有的节点),这确保了该图是连通的。显然,这样的一个有向环确保了该图中没有终止点(即任何一个点都有出边)。如果存在一对节点之间有多条相同的有向边,你的算法应该把它们当做是同一条边。a.txt的每一行表示一条有向边,第一列表示边的源结点,第二列表示边的目的节点。

l 实现过程:

设有向图 G=(V,E)有n个节点(编号为1,2,...N)和M条边,所有的节点都有至少一个出边,且M=[Mji](n*n)是一个m*n的随机邻接矩阵,定义如下:对任意i,j€[1,n]

里,deg(i)是图G中节点i的出边个数。基于PageRank的定义,设1-Β为随机跳转概率,我们将PageRank向量记为r,有如下等式

基于上面的公式,计算PageRank向量的迭代过程如下:

矩阵运算调用了 MathNet.Numerics

  public static double[,] Get()
{
double[,] m = new double[, ];
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
m[i, j] = ;
}
}
double[] s = new double[];
double[,] M = new double[, ];
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
M[i, j] = ;
} }
StreamReader sr = File.OpenText(@"E:\a.txt");
string nextLine;
while ((nextLine = sr.ReadLine()) != null)
{
char[] charTemp = { '\t' };
string[] arr = nextLine.Split(charTemp);
int[] d = Array.ConvertAll(arr, int.Parse);
int a1 = d[] - ;
int a2 = d[] - ;
m[a1, a2] = ;
}
sr.Close();
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
s[i] += m[i, j];
}
}
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
if (m[i, j] == )
M[j, i] = 1.0 / s[i];
}
}
return M;
}
public static double [] Getmtrix(double[,] M)
{ double num = 0.8;
double[,] result = Get();
var mb = Matrix<double>.Build;
var A= mb.DenseOfArray(result);
var matrixR = mb.Dense(, , 0.001);
var matrixL = mb.Dense(, , 0.0002);
for (int p = ; p < ; p++)
{
matrixR = matrixL + (A * matrixR) * num;
}
double[,]b= matrixR.ToArray();
double[] d = new double[b.Length];
for (int i = ; i < b.Length; i++)
{
for (int j = ; j < ; j++)
{
d[i] = b[i, j];
}
}
return d;
}
public static void show(double[] a)
{
double[] a1 = Getmtrix(Get());
double max = ;
int maxindex = -;
for (int j = ; j < ; j++)
{
max = a1.Max();
maxindex = Array.IndexOf(a1, max);
a1[maxindex] = ;
Console.WriteLine("最大:{0}" + "节点:{1}", j+, maxindex+); } }
public static void show2(double[] a)
{
double[] a1 = Getmtrix(Get());
for (int j = ; j < ; j++)
{
double min = 1.0;
int minindex = -;
min = a1.Min();
minindex = Array.IndexOf(a1, min);
a1[minindex] = ;
Console.WriteLine("最小:{0}" + "节点:{1}", j + , minindex + );
}
Console.ReadKey();
}
static void Main(string[] args)
{
show(Getmtrix(Get()));
show2(Getmtrix(Get())); }

pagerank算法

输出

ü PageRank分值最高的5个节点的id

ü PageRank分值最低的5个节点的id

l graph-full.txt

c#,pagerank算法实现一的更多相关文章

  1. 【原创】机器学习之PageRank算法应用与C#实现(2)球队排名应用与C#代码

    在上一篇文章:机器学习之PageRank算法应用与C#实现(1)算法介绍 中,对PageRank算法的原理和过程进行了详细的介绍,并通过一个很简单的例子对过程进行了讲解.从上一篇文章可以很快的了解Pa ...

  2. 【原创】机器学习之PageRank算法应用与C#实现(1)算法介绍

    考虑到知识的复杂性,连续性,将本算法及应用分为3篇文章,请关注,将在本月逐步发表. 1.机器学习之PageRank算法应用与C#实现(1)算法介绍 2.机器学习之PageRank算法应用与C#实现(2 ...

  3. 张洋:浅析PageRank算法

    本文引自http://blog.jobbole.com/23286/ 很早就对Google的PageRank算法很感兴趣,但一直没有深究,只有个轮廓性的概念.前几天趁团队outing的机会,在动车上看 ...

  4. PageRank算法简介及Map-Reduce实现

    PageRank对网页排名的算法,曾是Google发家致富的法宝.以前虽然有实验过,但理解还是不透彻,这几天又看了一下,这里总结一下PageRank算法的基本原理. 一.什么是pagerank Pag ...

  5. PageRank算法

    PageRank,网页排名,又称网页级别,传说中是PageRank算法拯救了谷歌,它是根据页面之间的超链接计算的技术,作为网页排名的要素之一.它通过网络浩瀚的超链接关系来确定一个页面的等级.Googl ...

  6. [转]PageRank算法

    原文引自: 原文引自: http://blog.csdn.net/hguisu/article/details/7996185 感谢 1. PageRank算法概述 PageRank,即网页排名,又称 ...

  7. Hadoop应用开发实战(flume应用开发、搜索引擎算法、Pipes、集群、PageRank算法)

    Hadoop是2013年最热门的技术之一,通过北风网robby老师<深入浅出Hadoop实战开发>.<Hadoop应用开发实战>两套课程的学习,普通Java开发人员可以在最快的 ...

  8. 关于pagerank算法的一点点总结

    1. PageRank算法每个顶点收敛的值与每个点的初值是没有关系的,每个点随便赋初值. 2.像q=0.8这样的阻尼系数已经解决了PageRank中处在的孤立点问题.黑洞效应问题. 3.当有那个点进行 ...

  9. 浅析PageRank算法

    很早就对Google的PageRank算法很感兴趣,但一直没有深究,只有个轮廓性的概念.前几天趁团队outing的机会,在动车上看了一些相关的资料(PS:在动车上看看书真是一种享受),趁热打铁,将所看 ...

  10. PageRank算法第一篇

    摘要by crazyhacking: 一 搜索引擎的核心问题就是3个:1.建立资料库,通过爬虫系统实现:2.建立一种数据结构,可以根据关键词找到含有这个词的页面.通过索引系统(倒排索引)实现.3排序系 ...

随机推荐

  1. 微信小程序开发 -- 通过云函数下载任意文件

    微信小程序开发 -- 通过云函数下载任意文件 1.云开发介绍 ​ 微信小程序开发者众所周知,小程序开发拥有许多限制,当我还是一个菜鸟入门的时候,第一关就卡在了没有备案域名的HTTP请求上面,那时候云开 ...

  2. vue使用IntersectionObserver实现无限下拉信息流

    基于 IntersectionObserver 异步监听方法,实现无线信息流下拉加载, https://developer.mozilla.org/zh-CN/docs/Web/API/Interse ...

  3. Druid数据库连接池的使用

    Druid  阿里提供的数据库连接池,集以上连接池优点于一身,开发使用此连接池 使用配置文件方式获取Druid数据库连接池 TestDruid package com.aff.connection; ...

  4. DataFrame的apply用法

    DataFrame的apply方法: def cal_value_percent(row,total_value): row['new_column']=row[estimated_value_col ...

  5. Salesforce LWC学习(十七) 前端知识之 onclick & onblur & onmousedown

    在Salesforce LWC学习(八) Look Up组件实现篇中,我们实现了公用的lookup组件,使用的过程中,会发现当我们输入内容以后,搜索出来的列表便无法被清空. 针对此种情况我们打算优化一 ...

  6. Java实现 LeetCode 1两数之和

    1. 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这 ...

  7. Java中抽象类与接口的详细说明

    首先简单的介绍一下抽象类: 定义是很简单的,我们这里不写官方的语言,我自己看着都烦,我们就用白话介绍,抽象类本质是一个类,没问题,那么类里面一般都是有方法的,方法包括方法名和方法体,这是常识对不对,那 ...

  8. java中ThreadLocal类的详细介绍(详解)

    ThreadLocal简介 变量值的共享可以使用public static的形式,所有线程都使用同一个变量,如果想实现每一个线程都有自己的共享变量该如何实现呢?JDK中的ThreadLocal类正是为 ...

  9. Java实现 串中取3个不重复字母

    从标准输入读入一个由字母构成的串(不大于30个字符). 从该串中取出3个不重复的字符,求所有的取法. 取出的字符,要求按字母升序排列成一个串. 不同的取法输出顺序可以不考虑. 例如: 输入: abc ...

  10. java实现第五届蓝桥杯信号匹配

    信号匹配 从X星球接收了一个数字信号序列. 现有一个已知的样板序列.需要在信号序列中查找它首次出现的位置.这类似于串的匹配操作. 如果信号序列较长,样板序列中重复数字较多,就应当注意比较的策略了.可以 ...