1、算法名称

超文本敏感标题搜索 (Hyperlink-Induced Topic Search)

2、算法背景

HITS 算法是由康奈尔大学的Jon Kleinberg 博士于1997 年首先提出的,为IBM 公司阿尔马登研究中心的名为"CLEVER"的研究项目中的一部分。

作为几乎是与PageRank同一时期被提出的算法,HITS同样以更精确的搜索为目的,并到今天仍然是一个优秀的算法。在HITS算法中,每个页面被赋予两个属性:hub属性和authority属性。同时,网页被分为两种:hub页面和authority页面。hub,中心的意思,所以hub页面指那些包含了很多指向authority页面的链接的网页,比如国内的一些门户网站;authority页面则指那些包含有实质性内容的网页。HITS算法的目的是:当用户查询时,返回给用户高质量的authority页面。

3、算法思想

按照HITS算法,用户输入关键词后,算法对返回的匹配页面计算两种值,一种是枢纽值,另一种是权威值,这两种值是互相依存、互相影响的。所谓枢纽值,指的是页面上所有导出链接指向页面的权威值之和。权威值是指所有导入链接所在的页面中枢纽之和。通常HITS算法的基本思想是:

好的Hub型网页指向好的Authority型网页。

好的Authority型网页是由好的Hub型网页所指向的网页。

4、算法流程

HITS算法是利用HubPAuthority的搜索方法,

具体算法如下:

将查询q提交给基于关键字查询的检索系统,从返回结果页面的集合中取前n个网页(如n=200),作为根集合(root set),记为S,则S满足:

(1)S中的网页数量较少

(2)S中的网页是与查询q相关的网页

(3)S中的网页包含较多的权威(Authority)网页

通过向S 中加入被S 引用的网页和引用S 的网页,将S 扩展成一个更大的集合T. 以T 中的Hub 网页为顶点集V1 ,以权威网页为顶点集V2 。

V1 中的网页到V2 中的网页的超链接为边集E ,形成一个二分有向图. 对V1 中的任一个顶点v ,用h ( v) 表示网页v 的Hub 值,且h ( v)收敛;对V2 中的顶点u ,用a ( u) 表示网页的Authority 值。

开始时h ( v) = a ( u) = 1 ,对u 执行I 操作,修改它的a ( u) ,对v执行O操作,修改它的h ( v) ,然后规范化a ( u),h ( v) ,如此不断的重复计算下面的I操作和O操作,直到a ( u),h(v)收敛 。

其中I操作:a ( u) = Σh ( v) ;O 操作: h ( v) = Σa ( u) 。每次迭代对a ( u) 、h ( v) 进行规范化处理: a ( u) = a ( u)/Σ[ a ( q) ]2 ; h ( v) = h ( v)/Σ[ h ( q) ]2 。

5、算法实现

伪代码:

G= set of pages
for eachpage in G do
p.auth = 1 // 权威值
p.hub = 1 //枢纽值
HubsAndAuthorities(G)
for step from 1 to k do // run the algorithm for k steps
norm = 0
for eachpage in G do // update all authority values first
p.auth = 0
for eachpage in p.incomingNeighbors do //计算平方的总和
p.auth +=q.hub
norm += square(p.auth) // 计算auth平方的和
norm = sqrt(norm)
for eachpage in G do // update the auth scores
p.auth =p.auth / norm // 归一
norm = 0
for eachpage in p.outgoingNeighbors do
p.hub +=r.auth
norm += square(p.hub) // 计算中心值平方的和
norm = sqrt(norm)
for eachpagepinGdo
p.hub =p.hub / norm

测试代码:

def initialize_authority(pages):  # 初始化权限向量,一个字典,其中键是url,值都是1
return dict(zip(pages.keys(), [1] * len(pages))) def clean_pages(pages): # 删除指向当前正在运行HITS的页面之外的链接
for page in pages:
outside_links = []
for i in range(len(pages[page])):
if pages[page][i] not in pages or pages[page][i] == page:
outside_links.append(i)
outside_links.reverse()
for outside_link in outside_links:
pages[page].pop(outside_link)
return pages def initialize_L_matrices(pages):
"""
Initializes L, which is just the pages dictionary, and then computes the transpose of L.
Matrices are pretty compact since we only store non zero cells.
"""
L_matrix = pages
Lt_matrix = {}
for page in pages:
Lt_matrix[page] = []
for page in pages:
for link in pages[page]:
Lt_matrix[link].append(page)
return L_matrix, Lt_matrix def multiply_matrix_vector(matrix, vector):
"""
Multiplies a matrix and a vector
"""
result_matrix = {}
for row in matrix:
result_matrix[row] = 0
for item in matrix[row]:
result_matrix[row] += vector[item]
return result_matrix def normalize(vector):
"""
Takes a vector and divides all components by the component with the max value.
This means that the largest value in the vector will be 1.
"""
max = 0
for component in vector:
if vector[component] > max:
max = vector[component]
if max == 0:
return vector
for component in vector:
vector[component] = float(vector[component]) / max
return vector def vector_difference(vector1, vector2):
"""
Returns the sum of all of the differences between components in vector1 and vector2.
"""
if not (vector1 and vector2): return float("inf")
total = 0
for component in vector1:
total += abs(vector1[component] - vector2[component])
return total def HITS(pages):
"""
Runs HITS
"""
pages = clean_pages(pages)
authority_old = None
authority = initialize_authority(pages)
(L_matrix, Lt_matrix) = initialize_L_matrices(pages)
while vector_difference(authority_old, authority) > 0.1:
authority_old = authority
hubbiness = normalize(multiply_matrix_vector(L_matrix, authority))
authority = normalize(multiply_matrix_vector(Lt_matrix, hubbiness))
return authority, hubbiness def main():
"""
A simple example of HITS.
Page a has links to b and c. Page b links to f. Page c links to b and e. Etc.
"""
pages = {"a": ["b", "c"], "b": ["f"], "c": ["b", "e"], "d": ["b"], "e": ["c"]}
(authority, hubbiness) = HITS(pages)
print("Authority: " + str(authority))
print("Hubbiness: " + str(hubbiness)) if __name__ == "__main__":
main()

6、算法应用

HITS算法是Web结构挖掘中最具有权威性和使用最广泛的算法。HITS算法是利用Web的链接结构进行挖掘典型算法,其核心思想是建立在页面链接关系的基础上,对链接结构的改进算法。HITS算法通过两个评价权值--内容权威度(Authority)和链接权威度(Hub)来对网页质量进行评估。其基本思想是利用页面之间的引用链来挖掘隐含在其中的有用信息(如权威性),具有计算简单且效率高的特点。HITS算法认为对每一个网页应该将其内容权威度和链接权威度分开来考虑,在对网页内容权威度做出评价的基础上再对页面的链接权威度进行评价,然后给出该页面的综合评价。内容权威度与网页自身直接提供内容信息的质量相关,被越多网页所引用的网页,其内容权威度越高;链接权威度与网页提供的超链接页面的质量相关,引用越多高质量页面的网页,其链接权威度越高。

7、算法缺点

1️⃣计算效率低

这里说的“效率低”是针对其实时计算的特点而提出的。HITS算法是在用户提出搜索请求之后才开始运行的,然而计算出结果又需要多次迭代计算,所以就这点上来说HITS算法效率仍然较低。

2️⃣主题漂移

在算法原理部分介绍了HITS算法是如何生成初始集合。从根集合我们通过链接添加网页的方法进行扩展,但这也很可能添加进与搜索主题无关的网页。若是这部分网页中又恰恰有着一些高质量的authority页面,则很有可能返回给用户,降低用户的搜索体验。

3️⃣易被作弊者操纵结果

试想我们弄一个页面指向很多高质量的authority页面,那么这个页面就成为了一个高质量的hub页面。然后再弄个链接指向自己的网页,按照HITS算法,将大大提升自己的网页的权威值。

HITS算法简介的更多相关文章

  1. webrtc 的回声抵消(aec、aecm)算法简介(转)

    webrtc 的回声抵消(aec.aecm)算法简介        webrtc 的回声抵消(aec.aecm)算法主要包括以下几个重要模块:1.回声时延估计 2.NLMS(归一化最小均方自适应算法) ...

  2. Hits算法

    HITS(HITS(Hyperlink - Induced Topic Search) ) 算法是由康奈尔大学( Cornell University ) 的Jon Kleinberg 博士于1997 ...

  3. AES算法简介

    AES算法简介 一. AES的结构 1.总体结构 明文分组的长度为128位即16字节,密钥长度可以为16,24或者32字节(128,192,256位).根据密钥的长度,算法被称为AES-128,AES ...

  4. 链接分析算法之:HITS算法

    链接分析算法之:HITS算法     HITS(HITS(Hyperlink - Induced Topic Search) ) 算法是由康奈尔大学( Cornell University ) 的Jo ...

  5. 排列熵算法简介及c#实现

    一.   排列熵算法简介: 排列熵算法(Permutation Entroy)为度量时间序列复杂性的一种方法,算法描述如下: 设一维时间序列: 采用相空间重构延迟坐标法对X中任一元素x(i)进行相空间 ...

  6. <算法图解>读书笔记:第1章 算法简介

    阅读书籍:[美]Aditya Bhargava◎著 袁国忠◎译.人民邮电出版社.<算法图解> 第1章 算法简介 1.2 二分查找 一般而言,对于包含n个元素的列表,用二分查找最多需要\(l ...

  7. LARS 最小角回归算法简介

    最近开始看Elements of Statistical Learning, 今天的内容是线性模型(第三章..这本书东西非常多,不知道何年何月才能读完了),主要是在看变量选择.感觉变量选择这一块领域非 ...

  8. AI - 机器学习常见算法简介(Common Algorithms)

    机器学习常见算法简介 - 原文链接:http://usblogs.pwc.com/emerging-technology/machine-learning-methods-infographic/ 应 ...

  9. HITS算法--从原理到实现

    本文介绍HITS算法的相关内容. 1.算法来源 2.算法原理 3.算法证明 4.算法实现 4.1 基于迭代法的简单实现 4.2 MapReduce实现 5.HITS算法的缺点 6.写在最后 参考资料 ...

随机推荐

  1. 任由文字肆意流淌,更自由的开源 Markdown 编辑器

    对于创作平台来说内容编辑器是十分重要的功能,强大的编辑器可以让创作者专注于创作"笔"下生花.而最好取悦程序员创作者的方法之一就是支持 Markdown 写作,因为大多数程序员都是用 ...

  2. MySQL-技术专题-MySQL主从架构以及[半同步机制]模式大全

    MySQL的主从复制 一般在大规模的项目上,都是使用MySQL的复制功能来创建MySQL的主从集群的. 主要是可以通过为数据库服务器配置一个或多个备库的方式来进行数据同步. 复制的功能不仅有利于构建高 ...

  3. bash-completion linux命令补全

    1.有时候用docker run 或者kubectl 想tab补全的时候用不了 这个时候可以安装一个神奇的包bash-completion yum install bash-completion 2. ...

  4. 羽夏看Win系统内核——环境搭建

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  5. Apache Dolphin Scheduler - Dockerfile 详解

    Apache DolphinScheduler 是一个分布式去中心化,易扩展的可视化 DAG 工作流任务调度系统.简称 DS,包括 Web 及若干服务,它依赖 PostgreSQL 和 Zookeep ...

  6. Django学习day06随堂笔记

    每日测验 """ 今日考题 1.什么是FBV与CBV,能不能试着解释一下CBV的运作原理 2.模版语法的传值需要注意什么,常见过滤器及标签有哪些 3.自定义过滤器,标签, ...

  7. Vue组件封装之无限滚动列表

    无限滚动列表:分为单步滚动和循环滚动两种方式 <template> <div class="box" :style="{width:widthX,hei ...

  8. 优雅地创建未定义类PHP对象

    在PHP中,如果没有事先准备好类,需要创建一个未定义类的对象,我们可以采用下面三种方式: new stdClass() new class{} (object)[] 首先是stdClass,这个类是一 ...

  9. CSS linear-gradient() 函数

    用于背景颜色渐变或画线条等场景 linear-gradient() 函数用于创建一个表示两种或多种颜色线性渐变的图片. 创建一个线性渐变,需要指定两种颜色,还可以实现不同方向(指定为一个角度)的渐变效 ...

  10. php 设计模式 --桥接模式

    php抽象类和接口的区别 https://www.cnblogs.com/vinter/p/8716685.html 什么时候适合使用 --- 多个角色配合工作:抽象角色对应具体角色: <?ph ...