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. ysoserial CommonsColletions2分析

    ysoserial CommonsColletions2分析 前言 此文章是ysoserial中 commons-collections2 的分析文章,所需的知识包括java反射,javassist. ...

  2. 手把手教你如何玩转消息中间件(ActiveMQ)

    手把手教你如何玩转消息中间件(ActiveMQ) 2018年07月15日 18:07:39 Cs_hnu_scw 阅读数 12270 标签: 中间件消息中间件ActiveMQ分布式集群 更多 个人分类 ...

  3. MapReduce 示例:减少 Hadoop MapReduce 中的侧连接

    摘要:在排序和reducer 阶段,reduce 侧连接过程会产生巨大的网络I/O 流量,在这个阶段,相同键的值被聚集在一起. 本文分享自华为云社区<MapReduce 示例:减少 Hadoop ...

  4. RocketMQ详解(二)安装使用详解

    专题目录 RocketMQ详解(一)原理概览 RocketMQ详解(二)安装使用详解 RocketMQ详解(三)启动运行原理 RocketMQ详解(四)核心设计原理 RocketMQ详解(五)总结提高 ...

  5. Java比较两个浮点数

    浮点数的基本数据类型不能用==比较,包装数据类型不能用 equals 比较 浮点数的表示 在计算机系统中,浮点数采用 符号+阶码+尾数 进行表示.在Java中,单精度浮点数float类型占32位,它的 ...

  6. CodeForce-812C Sagheer and Nubian Market(二分)

    Sagheer and Nubian Market CodeForces - 812C 题意:n个货物,每个货物基础价格是ai. 当你一共购买k个货物时,每个货物的价格为a[i]+k*i. 每个货物只 ...

  7. Markdown公式用法大全

    目录 基本语法 两种代码引用方式 插入链接并描述 插入图片 有序列表 无序列表 分割线 表格 如何插入公式 如何输入上下标 如何输入括号和分隔符 如何输入分数 如何输入开方 如何输入省略号 如何输入矢 ...

  8. 对象赋值在PHP中到底是不是引用?

    之前的文章中,我们说过变量赋值的问题,其中有一个问题是对象在进行变量赋值的时候,直接就是引用赋值.那么到底真实情况是怎样呢? 之前变量赋值的文章 PHP的变量赋值 对象引用测试 在继续深入的学习PHP ...

  9. 一文让你彻底搞懂 vue-Router

    路由是网络工程里面的专业术语,就是通过互联把信息从源地址传输到目的地址的活动.本质上就是一种对应关系.分为前端路由和后端路由. 后端路由: URL 的请求地址与服务器上的资源对应,根据不同的请求地址返 ...

  10. Linux系列(37) - 源码包与RPM包区别(1)

    源码包是不能使用[service]命令来启动服务,因为源码包的安装位置由用户指定 源码包一般安装在: /usr/local/软件名/ ,源码包安装的服务,只能用绝对路径进行服务的管理 rpm包安装后, ...