流行排序和佩奇排序简述(manifold rank Page rank)

2023-11-26 17:30

本文主要是介绍流行排序和佩奇排序简述(manifold rank Page rank),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

流行排序和佩奇排序简述(manifold rank & Page rank)

最近看了一篇文章,其中用到了流行排序(manifold ranking),于是就重新补查了一下流行排序,又因为流行排序中的收敛性用到了佩奇排序(page rank),所以这里就简单的叙述一下page rank和manifold rank。希望大家能有所收获。由于manifold rank中用到了page rank的思想,因此此博客就先叙述page rank,再进而叙述manifold rank。

佩奇排序(Page rank)

佩奇排序因其英文名字是page rank,并且最早应用于搜索网页的排序,所以佩奇排序也被叫做页排序。


实际上Page rank之所以得名是因为google创始人之一的拉里佩奇(Lawrence Page)有关,他也是page rank的提出者,这一算法被用于解决网页排序的问题。如下图所示,我们使用不同的搜索引擎,往往会得到不同的结果。那么google最初是如何实现网页的排序的呢?那就是page rank啦。


page rank的基本思想是利用马尔科夫过程中的马尔科夫稳定性(markoff stability),其算法步骤也是十分的简单:

(1)假设我们正在上网,我们会随便的选一个网页待上一会儿,然后再随机的跳转到该网页连接的另外的网页,通过上述的方式,我们就能得到状态转移矩阵。

(2)然后一直重复上次操作,直到收敛(其收敛是由于马尔科夫的稳定性)。

(3)最后通过比较上网者浏览所有网页的概率分布,对网页进行排序。概率越大的网页,排序越靠前。

--》--》

如上图所述,首先作为一个随机的上网者,我们访问ABCD四个网站的概率都是1/4,网站A有分别以1/3的概率跳转到BCD,以此类推,我们就可以得到状态状态转移矩阵M,其中第1列就表示网站A跳转到BCD的概率,又因为先假设A不能够自己跳转到自己所以A到A的跳转概率是0。因此经过一次跳转的结果便是V1,以此类推,我们继续用M*V1便可以得到第二部跳转的状态转移矩阵。我们就这样一直在网页间进行跳转,由于马尔科夫的稳定性,我们知道这样的跳转最终会导致收敛,最后的用户浏览A,B,C,D的概率分布就为3/9,2/9,2/9,2/9,最后我们按照这个概率分布的大小对网页进行排序,这就是page rank啦!

但是这个原始的page ranking是存在bug的,也就是会有一些先验假设:如,1.不能存在某个网页不跳转到任何的网页,也就是上面的terminal point的问题,这会使得最后A,B,C,D的概率分布都为0。2.也不能存在某个网页自己跳转到自己,也就是上面的 trap problem的问题,这会使得A,B,C,D的概率在有自己跳转的网页上的概率为1,而其他的概率为0。

有没有什么方法解决这一问题呢?答案是肯定的。


那就是在状态转移方程中加入扰动项,即红框中的内容。这样我们就能使浏览者以一定的概率跳出terminal point和trap problem的问题使得状态转移能够收敛。

流行排序(Manifold ranking)

流行排序出处是Dengyong Zhou的“Ranking on Data Manifolds” NIPS(2003),其要解决的问题是如何实现如下数据的排序:


其中红色十字被称为是问询点(query),我们想通过问询问询点实现对数据的排序,使得数据的排序像(c)图中展现的那样,如果我们只是单纯的使用欧氏距离对这些数据点进行排序则会得到图(b)所示的结果,但是我们希望得到的排序是像图(c)一样的排序。这时我们该如何处理呢?

Dengyong Zhou的做法是:

(1)先衡量数据点和问询点之间,以及这些数据点之间的距离,并将这些点两两之间的距离按照升序进行排列,同时将这两点进行连接,重复实现这两点之间的连接直到生成一个连接图。(连接图在下面的图中会有所展示)。


(2)根据生成的连接图和边的长度(两点之间的距离)设置边的权重,权重的公式是采用的e指数的形式,如上图2步所示。如果没有连接,即没有边,则权重为零。这样我们就得到了一个权重矩阵W。

(3)用一个对角矩阵D对W进行归一化处理,D的对角线上的元素是W中所对应的行的元素的加和。

(4)与前面将的改进的page ranking相似,令“浏览者”在这个图上进行随机浏览,也可称之为迭代传播,直至收敛。

(5)最后使用收敛后的排序值的大小f*最为最后排序的依据。

可赞的是,作者还给出了收敛性的证明,以及收敛的值。


如上图3中的结果就是最后收敛的值,但是最后作者还给出了建议,由于直接计算最后收敛的结果在数据很多的情况下是不可行的,所以还是建议大家使用迭代的方式进行计算。

最后给出流行排序的迭代步骤和结果图。


如上图1中所示的就是,所生成的连接图。

关于流行排序我就写到这里了,仅为了记录一下我看过的东西,备忘一下,也希望能够对大家有所帮助。



这篇关于流行排序和佩奇排序简述(manifold rank Page rank)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/426089

相关文章

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

hdu 1285(拓扑排序)

题意: 给各个队间的胜负关系,让排名次,名词相同按从小到大排。 解析: 拓扑排序是应用于有向无回路图(Direct Acyclic Graph,简称DAG)上的一种排序方式,对一个有向无回路图进行拓扑排序后,所有的顶点形成一个序列,对所有边(u,v),满足u 在v 的前面。该序列说明了顶点表示的事件或状态发生的整体顺序。比较经典的是在工程活动上,某些工程完成后,另一些工程才能继续,此时

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

【软考】希尔排序算法分析

目录 1. c代码2. 运行截图3. 运行解析 1. c代码 #include <stdio.h>#include <stdlib.h> void shellSort(int data[], int n){// 划分的数组,例如8个数则为[4, 2, 1]int *delta;int k;// i控制delta的轮次int i;// 临时变量,换值int temp;in

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

鸡尾酒排序算法

目录 引言 一、概念 二、算法思想 三、图例解释 1.采用冒泡排序:   2.采用鸡尾酒排序:  3.对比总结 四、算法实现  1.代码实现  2.运行结果 3.代码解释   五、总结 引言 鸡尾酒排序(Cocktail Sort),也被称为双向冒泡排序,是一种改进的冒泡排序算法。它在冒泡排序的基础上进行了优化,通过双向遍历来减少排序时间。今天我们将学习如何在C

快速排序(java代码实现)

简介: 1.采用“分治”的思想,对于一组数据,选择一个基准元素,这里选择中间元素mid 2.通过第一轮扫描,比mid小的元素都在mid左边,比mid大的元素都在mid右边 3.然后使用递归排序这两部分,直到序列中所有数据均有序为止。 public class csdnTest {public static void main(String[] args){int[] arr = {3,

O(n)时间内对[0..n^-1]之间的n个数排序

题目 如何在O(n)时间内,对0到n^2-1之间的n个整数进行排序 思路 把整数转换为n进制再排序,每个数有两位,每位的取值范围是[0..n-1],再进行基数排序 代码 #include <iostream>#include <cmath>using namespace std;int n, radix, length_A, digit = 2;void Print(int *A,

常用排序算法分析

1. 插入排序 1.1 性能分析 时间复杂度O(n^2), 空间复杂度O(1) 排序时间与输入有关:输入的元素个数;元素已排序的程度。 最佳情况,输入数组是已经排好序的数组,运行时间是n的线性函数; 最坏情况,输入数组是逆序,运行时间是n的二次函数。 1.2 核心代码 public void sort(){int temp;for(int i = 1; i<arraytoSort.