相似数据检测算法对给定的一对数据序列计算两者之间的相似度([0,1], 1表示完全相同)或距离([0, ), 0表示完全相同),从而度量数据之间的相似程度。相似数据检测在信息科学领域具有非常重要的应用价值,比如搜索引擎检索结果的聚类与排序、数据聚类与分类、Spam检测、论文剽窃检测、重复数据删除、Delta数据编码等应用。正是由于它的重要性,近年来成为了研究的重点,不断有新检测方法涌现并得到评估。其中,Broder提出的shingling算法和Charikar的simhash算法被认为是目前为止最好的算法。
对于相似数据检测,最为简单地可以采用类似Unix diff的方法。Unix diff对文档进行逐行对比来检测相似文件,它采用经典的LCS(Longest Common Subsequence,最长公共子串)算法,运用动态规划方法来计算相似性。LCS的含义是同时包含在字符串里的一个最长字符序列,LCS的长度作为这两个字符串相似性的度量。Diff算法以整行作为"字符"来计算最长公共子串,性能上比字符级的LCS算法快很多。这种方法效率很低,而且只适用文本文件的相似比较,不能直接适用于二进制文件。为此,研究者们提出为每个文档提取一组特征,这样将文件相似性问题转换为集合相似性问题,如基于shingle的计算方法。这种方式的核心思想是为每个文件提取组特征值,以特征值集合来计算相似性,从而降低空间和计算复杂性来提高性能。
经过对shingle算法和simhash算法以及笔者基于bloom filter实现算法的分析,相似数据检测算法大致流程如下:
(1) 将数据段分解成一组shingle(即子序列或数据块),可以采用定长、变长、单词或段落(文本文件)等分块算法;
(2) 为了降低空间和时间计算复杂性,可以对shingle集合进行抽样,比如Min-Wise,Modm,Mins方法;
(3) 基于选定的shingle集合为数据文件抽取特征,通常是为每个shingle计算hash值组成的序列作为特征值;
(4) 为了降低空间和时间计算复杂性,可以对文件特征进行降维处理,比如simhash和bloom filter;
(5) 基于文件特征计算两个数据对象之间的相似性,计算方法有Cosine、Overlap、Dice、Jaccard或Hamming距离。
Shingle算法
Shingle算法的核心思想是将文件相似性问题转换为集合的相似性问题,集合的相似性度量方法主要有resemblance 和containment两种,其定义如下。
|shingle(f1, w) ∩ shingle(f2, w)|
Rw(f1, f2) = ----------------------------------------------
|shingle(f1, w) ∪ shingle(f2, w)|
|shingle(f1, w) ∩ shingle(f2, w)|
Cw(f1, f2) = ----------------------------------------------
|shingle(f1, w)|
数量较大时,如果对所有shingle进行相似性处理则系统开销较大,包括内存和CPU资源。这时就可以考虑对shingle集合进行抽样,以降低空间和时间计算复杂性,但同时由于样本覆盖率有限,相似性精确度会有所降低。shingle取样主要有三种方法,即Min-Wise,Modm,和Mins。Min-Wise技术是通过将shingle的长度w和整数值进行映射产生随机哈希的公共集,在此相同的模式下进行随机最小独立置换的采样,从而得到采样集合;Modm 技术是通过在与Min-Wise同样的公共映射集中选择所有模m为0 的哈希值对应的shingle组成取样集合;Mins技术同样也是先将shingle和整数集进行映射,然后从中选择最小s个元素组成取样集合。此外,还可以使用shingle的hash值代表shingle进行相似性计算,能够节省一定计算开销。
Simhash算法
Shingle算法的空间和时间计算复杂性都比较高,对于大数据集的Simlarity Join问题将难以适用。Charikar的simhash算法的核心思想是用一个b位的hash值来表示文件的特征值,然后使用simhash之间的Hamming距离来衡量相似性。Hamming距离的定义为,两个二进制序列中对应位不同的个数。simhash的计算方法如下:
(1) 将一个b维的向量V初始化为0,b位的二进制数s初始化为0;
(2) 对每一个shingle,用hash函数(如MD5, SHA1)计算一个b位的签名h。对i=1到b,如果h的第i位为1,则V的第i个元素加上该特征权重;否则,V的第i个元素减去该特征权重;
(3) 如果V的第i个元素大于0,则s的第i位为1,否则为0;
(4) 输出s作为simhash。
与传统hash函数相比,simhash具有一个这样的显著特征,即越相似的文件具有越相似的simhash值,也就是说Hamming距离越小。显而易见,Simhash仅使用b位的hash值来表示文件 的特征,节省了大量的存储开销;Hamming距离计算简单高效,Simhash使用Hamming距离来衡量相似性,计算复杂性得到大大降低。简而言之,simhash算法通过对文件特征的降维,有效解决了Shingle算法的高空间和时间计算复杂性问题。然而,simhash算法的精确度也会有所损耗,并且与simhash的位数b有关,b越大精确度越高。
Bloom filter算法
与Simhash算法本质相似,Bloom filter算法的核心思想也是着眼于文件特征的降维,它使用Bloom filter数据结构来表示特征值。Bloom filter是一个空间效率很高的数据结构,它由一个位数组和一组hash映射函数组成。Bloom filter可以用于检索一个元素是否在一个集合中,它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。使用Bloom filter进行相似数据检测,可以弥补shingle中应用特征集交集计算文件相似性所导致的高计算和存储空间开销,在性能与相似性匹配精度之间取得平衡。Bloom
filter构造方法如下:
(1) 构造一个m位的bloom filter数据结构bf,并将所有位初始为0;
(2) 选定两个hash函数作为映射函数,分别为hash1,hash2;
(3) 对每一个shingle,分别应用hash1和hash2,并对bf相应比特位置1;
(4) 输出bf作为文件特征值。
这样,两个文件相似性计算就转换成两个bloom filter的相似性计算,越相似的文件在它们的bloom filter中有更多共同的1。由于Bloom filter具有有限的误识别率的特性,相似性算法精确度取决于Bloom filter的大小,越大则精确度越高,同时存储空间消耗也越大。Bloom filter同样可以使用Hamming距离衡量相似性,也可以使用Cosine、Overlap、Dice、Jaccard等方法来度量。Hamming距离前面已有定义,这里介绍一下后四种方法的计算公式。
dot(x, y)
Cosine_sim(x, y) = -----------------
sqrt(|x|.|y|)
dot(x, y)
Overlap_sim(x, y) = -----------------
min(|x|, |y|)
2.dot(x, y)
Dice_sim(x, y) = -----------------
|x| + |y|
dot(x, y)
Jaccard_sim(x, y) = ------------------------
|x| + |y| - dot(x, y)
其中,dot(x, y) = Σx[i].y[i],在这里相当于两个Bloom filter数据结构中同时为1的位数;|x|表示bloom filter数据结构中为1的位数。相似性计算函数如下:
三种算法对比
Shingle算法的空间和计算复杂性高,相似性精度也高,适合数据量不大且对精度要求高的应用。Simhash和bloom filter算法在空间消耗和计算复杂性方面都优于Shingle算法,但是精度有所损耗,取决于simhash的长度和bloom filter的大小。simhash的长度通常为64位或128位,这个基本可以满足应用的需求,可以根据实际需求增大位数。bloom filter要大于simhash长度,可以根据最大shingle数的两倍来估算,精度方面也要优于simhash。由于hash函数的碰撞问题,simhash和bloom
filter算法可能出现误判现象,即不相似的文件可能会判定为相似的。总结一下,通常情况下,文件特征值存储空间消耗方面,Shingle > bloom filter > simhash;相似性计算精度方面,Shingle < bloom filter < simhash。Bloom filter算法往往是比较折中的相似数据检测方法选择,但海量数据集的相似性计算往往采用simhash算法,在计算性能方面具有很大优势,而且更加适合MapReduce计算模型。
分享到:
相关推荐
1. **边缘检测**:首先,使用Canny或Sobel等边缘检测算法来提取图像的边缘。这一步是检测直线的基础,边缘点是直线可能存在的位置。 2. **边缘细化**:对边缘进行细化处理,减少边缘点的数目,同时保持边缘的主要...
【基于分布式架构的时间序列局部相似检测算法】 时间序列分析在许多领域,如金融、生物信息学、物联网等,都有广泛的应用。动态时间规整(Dynamic Time Warping, DTW)是一种常用的序列匹配方法,尤其在处理时间...
SimHash算法是一种基于局部敏感哈希技术的算法,常被用于检测文本相似性问题,尤其在文本重复数据删除、网页重复性检测等领域具有广泛应用。本文针对SimHash算法在文本检测去重中的应用及存在的问题进行了深入研究,...
基于Simhash算法的海量文本相似性检测方法研究 知识文档搜索在当今信息社会中扮演着重要角色。当用户输入关键词进行搜索时,现有的知识库系统通常只能匹配并返回包含关键词的文档,而无法有效地识别并推荐语义上...
### 基于时序数据的异常检测算法 #### 一、时序数据异常检测概况 在当前的大数据时代背景下,随着物联网、云计算等技术的迅速发展,时序数据异常检测已经成为数据分析领域的一个重要研究方向。它涉及从连续的时间...
运用目标分布数据, 结合相似分布理论, 提出了利用Tr-OEM 算法对流数据中的概念漂移现象进行检测. 该算法能够 动态地判断流数据概念漂移的发生, 自适应地优化概念漂移的检测值, 适用于不同类型的流数据. 通过...
通过实际应用,我们能够看到目标检测算法在处理具有相似特征的不同目标时的性能差异,这对于算法的改进和创新具有重要意义。 此外,数据集的规模虽然相对较小,但它为研究者提供了一个很好的起点。在初步的实验和...
**苏珊角点检测算法(SUSAN)详解** 苏珊角点检测算法,简称SUSAN(Simple and Effective Corner Detection),是由英国牛津大学的Michael J. Swain和Dana H. Ballard于1994年提出的。该算法以其高效、简单且鲁棒性...
"不确定数据的聚类分析与异常点检测算法" 本文主要研究了不确定数据的聚类和异常点检测问题,旨在为不确定数据提供更为多样的聚类分析和异常点检测功能。通过对不确定数据的研究,本文提出了四种面向不确定数据的...
在这种背景下,"使用PCA和K-Means聚类的无监督变化检测算法"是针对遥感图像处理的一种有效方法,它可以帮助我们识别和定位两个不同时间点卫星图像之间的显著变化。 **主成分分析(PCA)** 是一种统计方法,用于降低...
2. 聚类算法:如K-means、层次聚类、DBSCAN等,它们无监督地将数据点按相似性分组,寻找自然的群体结构。 3. 关联规则学习:如Apriori和FP-Growth算法,用于发现项集之间的频繁模式,例如“如果顾客买了尿布,那么...
连通域检测算法是计算机视觉和图像处理领域中的一个重要概念,它主要用于识别图像中相同颜色或特定特征的连续区域。这些区域在图像中被视为一个整体,可以是物体、背景或者其他有意义的图像元素。在给定的标题“连...
基于深度学习的回环检测算法研究 摘要:本文主要探讨了移动机器人在进行定位和建图过程中出现的位姿漂移问题。在机器人利用视觉传感器进行移动时,通过分析相邻两帧图片来计算位姿变化,这种计算方式导致随着时间的...
总结来说,"基于python的半监督异常检测算法设计与实现"这个主题涵盖了许多重要的数据科学概念,包括半监督学习、异常检测、Python编程以及聚类分析。通过`ADOA.py`和`cluster_centers.py`这两个文件,我们可以看到...
基于随机注意力的相似目标鉴别检测算法研究-SA-YOLOV7.zip内容涉及了计算机视觉领域中的一项创新技术,即利用深度学习模型实现对相似目标的有效鉴别和检测。这一技术的核心在于SA-YOLOV7,这是一种改进的YOLO(You ...
聚类是寻找数据内在结构,将相似数据分组的过程,通常在没有标签信息的情况下进行。 第六章如果存在,可能涵盖关联规则学习,如Apriori和FP-Growth算法,它们用于发现项集之间的频繁模式,常应用于市场篮子分析。 ...
本压缩包“数据科学算法基础.zip”显然是针对初学者或希望深入理解数据科学算法的人设计的。下面我们将详细探讨数据科学中的基础算法及其重要性。 首先,数据预处理是数据科学流程的关键步骤,包括数据清洗、缺失值...
Drummond在2006年提出,它是一种基于局部像素比较的快速角点检测算法,其核心思想是以一个像素为中心,在其周围画一个圆,按照特定的规则检查圆周上的像素是否具有相似的亮度值,从而快速判定该像素点是否为角点。...