当前位置: 首页 > article >正文

大数据挖掘--两个角度理解相似度计算理论

文章目录

  • 0 相似度计算可以转换成什么问题
  • 1 集合相似度的应用
    • 1.1 集合相似度
      • 1.1文档相似度
      • 1.2 协同过滤
        • 用户-用户协同过滤
        • 物品-物品协同过滤
    • 1.2 文档的shingling--将文档表示成集合
      • 1.2.1 k-shingling
      • 1.2.2 基于停用词的 shingling
    • 1.3 最小哈希签名
    • 1.4 局部敏感哈希算法(LSH)
    • 1.5 最小哈希签名和局部敏感哈希(LSH)的概念结合示例
        • 最小哈希签名步骤:
        • 局部敏感哈希 (LSH) 步骤:
  • 2 距离测度的应用
    • 2.1 距离测度
      • 1. 欧氏距离 (Euclidean Distance)
      • 2. 余弦距离 (Cosine Distance)
      • 3. 编辑距离 (Edit Distance)
      • 4. 海明距离 (Hamming Distance)
  • 3 LSH函数家族

0 相似度计算可以转换成什么问题

相似度计算是数据分析和机器学习领域中一项关键任务,它可以帮助我们理解和分析不同对象之间的相似性。然而,相似度计算本身可以通过转换成其他类型的问题来更加有效地处理和解决。

首先,我们来看一种常见的相似度度量——Jaccard相似度。Jaccard相似度将相似度计算视为集合之间的比较问题。具体来说,它关注两个集合之间的交集相对于并集的大小。这种方法特别适合用于需要比较集合相似性的场景,比如在文本分析中,我们可以将文档表示为一组词的集合,Jaccard相似度帮助我们评估两份文档的相似程度。通过计算交集和并集,我们将相似度问题转化为集合运算问题,这种方法简洁而有效,尤其在需要处理大量数据时,利用集合操作的高效性可以显著提高计算速度。

另一方面,相似度计算也可以转换为距离测度的问题。在这种情况下,我们将对象视为几何空间中的点,计算这些点之间的距离来推断相似性。欧氏距离是一种直观的衡量方式,它通过计算两点之间的直线距离来评估它们的接近程度。这种方法在需要空间可视化的场合中非常有用。此外,还有曼哈顿距离,它通过计算路径总长来反映两点的差异,这在某些离散空间中表现出色。余弦相似度则提供了另一种转换视角,通过考察向量之间的夹角来确定它们的相似性,这在高维向量空间中,尤其在文本分析和推荐系统中,被广泛使用。

1 集合相似度的应用

1.1 集合相似度

1.1文档相似度

在文本分析中,我们常常需要衡量两篇文档之间的相似性,这可以通过集合相似度来实现。一个常用的方法是Jaccard相似度。假设有两个文档 A A A B B B,我们可以将它们表示为词的集合,分别记为 S A S_A SA S B S_B SB。Jaccard相似度计算公式如下:

J ( S A , S B ) = ∣ S A ∩ S B ∣ ∣ S A ∪ S B ∣ J(S_A, S_B) = \frac{|S_A \cap S_B|}{|S_A \cup S_B|} J(SA,SB)=SASBSASB

其中, ∣ S A ∩ S B ∣ |S_A \cap S_B| SASB 是两个集合的交集的大小, ∣ S A ∪ S B ∣ |S_A \cup S_B| SASB 是两个集合的并集的大小。Jaccard相似度的值在 0 到 1 之间,值越大表示两个文档越相似。

算法:在实际应用中,计算文档相似度时,我们可以进行如下步骤:

  1. 将每个文档转换为词集合。
  2. 计算每对文档集合的交集和并集大小。
  3. 应用Jaccard公式计算相似度。

这种方法简单高效,特别适合于初步的文本聚类和分类问题。

1.2 协同过滤

在推荐系统中,协同过滤是一种广泛使用的方法。这里我们主要探讨基于集合相似度的协同过滤,包括用户-用户和物品-物品协同过滤。

用户-用户协同过滤

在用户-用户协同过滤中,我们通过比较用户之间的兴趣相似性来进行推荐。假设我们有用户 u i u_i ui u j u_j uj,它们的兴趣集合分别为 I i I_i Ii I j I_j Ij。我们可以使用Jaccard相似度来计算用户相似性:

J ( I i , I j ) = ∣ I i ∩ I j ∣ ∣ I i ∪ I j ∣ J(I_i, I_j) = \frac{|I_i \cap I_j|}{|I_i \cup I_j|} J(Ii,Ij)=IiIjIiIj

通过计算用户之间的Jaccard相似度,我们可以为用户推荐那些相似用户喜欢的物品。

物品-物品协同过滤

类似地,在物品-物品协同过滤中,我们比较物品之间的相似性。假设有物品 p a p_a pa p b p_b pb,它们的用户集合分别为 U a U_a Ua U b U_b Ub,我们计算物品的Jaccard相似度:

J ( U a , U b ) = ∣ U a ∩ U b ∣ ∣ U a ∪ U b ∣ J(U_a, U_b) = \frac{|U_a \cap U_b|}{|U_a \cup U_b|} J(Ua,Ub)=UaUbUaUb

物品相似性可以帮助我们推荐用户可能喜欢的其他相似物品。

算法:协同过滤的基本步骤包括:

  1. 构建用户-物品矩阵。
  2. 根据需要选择用户-用户或物品-物品的相似度计算。
  3. 计算相似度矩阵。
  4. 根据相似度为用户生成推荐列表。

通过利用集合相似度,我们能够有效地实现协同过滤,使推荐系统更加智能化和个性化。这些方法不仅提高了推荐的准确性,还提升了用户的参与感和满意度。

1.2 文档的shingling–将文档表示成集合

在文本处理和分析过程中,将文档转换为集合的形式可以帮助我们更好地进行相似度分析和其他文本操作。其中,shingling 是一种将文档转化为集合的方法,通过将文档分割为一系列短的连续子序列(或称为“片段”)来实现。以下是关于 k-shingling 和基于停用词的 shingling 的详细介绍。

1.2.1 k-shingling

k-shingling 是一种将文档转化为子序列集合的方法,通过将文档中的文本分割为长度为 k 的连续子字符串(或子词)来实现。每一个长度为 k 的子串称为一个“shingle”。这种方法的核心在于选择合适的 k 值,以确保文档可以被合理地分割。

步骤:

  1. 选择 k 值:通常,k 的选择取决于具体应用和文档长度。较小的 k 值可以捕捉到更多的局部信息,而较大的 k 值更能反映文档的全局结构。

  2. 生成 shingles:从文档中提取所有可能的 k-shingles。对于每一个连续的 k 个字符或词,记录为一个 shingle。

  3. 构建集合:将所有提取的 shingles 组成一个集合。此集合可以用来比较不同文档的相似性。

示例:对于字符串 “The quick brown fox” 和 k = 2,可能的 shingles 为 {“Th”, “he”, "e “, " q”, “qu”, “ui”, “ic”, “ck”, "k “, " b”, “br”, “ro”, “ow”, “wn”, "n “, " f”, “fo”, “ox”}。

1.2.2 基于停用词的 shingling

基于停用词的 shingling 是一种改进的 shingling 方法,它通过忽略文档中的停用词(例如 “the”, “is”, “at”, “on” 等),来生成更具意义的 shingles。这种方法可以帮助减少噪声,提高文档相似度计算的精确度。

步骤:

  1. 移除停用词:在进行 shingling 之前,首先从文档中移除常见的停用词。这可以通过预定义的停用词列表实现。

  2. 生成 shingles:在移除停用词后,使用类似 k-shingling 的方法生成 shingles。这样生成的 shingles 更能体现文档的核心内容。

  3. 构建集合:将生成的 shingles 组成一个集合,用于进一步的相似度计算。

优点:通过忽略停用词,基于停用词的 shingling 能够更专注于文档的主题词汇,减少不必要的干扰。

好的,以下是关于如何使用最小哈希签名将大文档压缩成小的签名,以及如何利用局部敏感哈希(LSH)算法处理这些签名,以保持文档间的相似度。

1.3 最小哈希签名

最小哈希签名是一种将大集合(如文档中的术语集合)压缩成较小的签名的技术,同时保留集合之间的相似度。这是通过一组哈希函数实现的,它们将集合中的元素映射到整数,并选取最小的数值作为签名。

步骤:

  1. 选择哈希函数:选择一组不同的哈希函数 h 1 , h 2 , … , h n h_1, h_2, \ldots, h_n h1,h2,,hn。每个哈希函数将文档中的shingle(子字符串)映射到一个整数。

  2. 生成签名:对于每个文档和每个哈希函数,计算所有shingle的哈希值,并记录最小的哈希值。重复此过程n次(使用n个不同的哈希函数),形成一个长度为n的签名向量。

  3. 保持相似度:两个文档的最小哈希签名相同元素的比例,接近于这两个文档的Jaccard相似度,即 J ( A , B ) = ∣ A ∩ B ∣ ∣ A ∪ B ∣ J(A, B) = \frac{|A \cap B|}{|A \cup B|} J(A,B)=ABAB

1.4 局部敏感哈希算法(LSH)

LSH 是一种用于快速查找相似文档的算法,特别适用于处理最小哈希签名。这种方法通过将签名分段,并使用哈希函数将相似的签名段映射到相同的桶中,从而实现高效的近似最近邻搜索。

步骤:

  1. 分段签名:将最小哈希签名分成若干段,每段包含若干个哈希值。例如,每个签名被分成b个段,每段包含r个哈希值。

  2. 映射到桶:对每个段,使用一个哈希函数将其映射到一个哈希桶。相似的文档由于签名段的相似性,很可能被映射到同一个桶中。

  3. 查找相似文档:当需要查找与某个文档相似的文档时,可以仅查找与其签名段映射到相同桶中的文档,这大大缩小了查找范围。

优势:通过结合最小哈希签名和 LSH,能够有效地处理和比较大规模文档集合。最小哈希签名减少了需要处理的数据量,而 LSH 提供了快速的相似性检索机制,使得处理大规模数据集的效率得以提升。

1.5 最小哈希签名和局部敏感哈希(LSH)的概念结合示例

假设我们有两个文档,它们的 shingle 集合如下:

  • 文档 A: {“shingle1”, “shingle2”, “shingle3”}
  • 文档 B: {“shingle2”, “shingle3”, “shingle4”}

我们应用三组不同的哈希函数 h 1 ( x ) h_1(x) h1(x), h 2 ( x ) h_2(x) h2(x), h 3 ( x ) h_3(x) h3(x),假设这些函数的输出如下:

  • h 1 ( " s h i n g l e 1 " ) = 5 h_1("shingle1") = 5 h1("shingle1")=5, h 1 ( " s h i n g l e 2 " ) = 3 h_1("shingle2") = 3 h1("shingle2")=3, h 1 ( " s h i n g l e 3 " ) = 7 h_1("shingle3") = 7 h1("shingle3")=7, h 1 ( " s h i n g l e 4 " ) = 6 h_1("shingle4") = 6 h1("shingle4")=6
  • h 2 ( " s h i n g l e 1 " ) = 2 h_2("shingle1") = 2 h2("shingle1")=2, h 2 ( " s h i n g l e 2 " ) = 9 h_2("shingle2") = 9 h2("shingle2")=9, h 2 ( " s h i n g l e 3 " ) = 1 h_2("shingle3") = 1 h2("shingle3")=1, h 2 ( " s h i n g l e 4 " ) = 4 h_2("shingle4") = 4 h2("shingle4")=4
  • h 3 ( " s h i n g l e 1 " ) = 8 h_3("shingle1") = 8 h3("shingle1")=8, h 3 ( " s h i n g l e 2 " ) = 6 h_3("shingle2") = 6 h3("shingle2")=6, h 3 ( " s h i n g l e 3 " ) = 5 h_3("shingle3") = 5 h3("shingle3")=5, h 3 ( " s h i n g l e 4 " ) = 3 h_3("shingle4") = 3 h3("shingle4")=3
最小哈希签名步骤:
  1. 计算最小哈希签名

    • 对于文档 A:
      • h 1 h_1 h1: 最小值是 3 (来自 “shingle2”)
      • h 2 h_2 h2: 最小值是 1 (来自 “shingle3”)
      • h 3 h_3 h3: 最小值是 5 (来自 “shingle3”)
    • 对于文档 B:
      • h 1 h_1 h1: 最小值是 3 (来自 “shingle2”)
      • h 2 h_2 h2: 最小值是 1 (来自 “shingle3”)
      • h 3 h_3 h3: 最小值是 3 (来自 “shingle4”)
  2. 生成最小哈希签名

    • 文档 A 的签名: (3, 1, 5)
    • 文档 B 的签名: (3, 1, 3)
  3. 比较签名:通过比较签名发现,文档 A 和 B 在三个哈希函数中有两个值相同,签名相同位置的值相同比例为 2/3。

局部敏感哈希 (LSH) 步骤:
  1. 分段签名

    • 将签名分成两段,每段包含一组哈希值:
      • 文档 A: (3, 1) 和 (5)
      • 文档 B: (3, 1) 和 (3)
  2. 映射到桶

    • 使用哈希函数对每一段进行哈希,映射到哈希桶:
      • 段 (3, 1) 的两文档都被映射到同一个桶,因此它们可能相似。
      • 段 (5) 和 (3) 被映射到不同的桶。
  3. 查找相似文档

    • 由于文档 A 和 B 在 (3, 1) 段中被映射到同一个桶,因此 LSH 会识别文档 B 作为文档 A 的相似候选者。

通过结合最小哈希签名和 LSH,我们大幅度降低了计算复杂度。最小哈希签名帮助我们压缩文档,同时保留相似度信息,而 LSH 则通过分段签名和桶映射,快速聚合可能相似的文档以进行进一步的精细比较。这种方法尤其适用于需要快速处理和比较的大规模数据集。

2 距离测度的应用

2.1 距离测度

1. 欧氏距离 (Euclidean Distance)

  • 定义:欧氏距离是两点间的“直线”距离,用于度量两个点在欧几里得空间中的距离。对于两个n维向量 A = ( a 1 , a 2 , . . . , a n ) A = (a_1, a_2, ..., a_n) A=(a1,a2,...,an) B = ( b 1 , b 2 , . . . , b n ) B = (b_1, b_2, ..., b_n) B=(b1,b2,...,bn),其计算公式为:
    Euclidean Distance = ∑ i = 1 n ( a i − b i ) 2 \text{Euclidean Distance} = \sqrt{\sum_{i=1}^{n} (a_i - b_i)^2} Euclidean Distance=i=1n(aibi)2
  • 应用:常用于几何空间中的距离计算,如图像处理、聚类分析(如k-means算法)。

2. 余弦距离 (Cosine Distance)

  • 定义:余弦距离实际上测量的是两个向量之间的夹角余弦值,表示两个向量的方向相似度。计算公式为:
    Cosine Similarity = A ⋅ B ∥ A ∥ ∥ B ∥ \text{Cosine Similarity} = \frac{A \cdot B}{\|A\| \|B\|} Cosine Similarity=A∥∥BAB
    余弦距离则为 1 − Cosine Similarity 1 - \text{Cosine Similarity} 1Cosine Similarity
  • 应用:适用于文本分析和信息检索,因为它关注的是向量的方向而不是大小,比如在文档相似性计算中。

3. 编辑距离 (Edit Distance)

  • 定义:编辑距离,又称Levenshtein距离,是将一个字符串转换成另一个字符串所需的最小编辑操作次数(包括插入、删除、替换的操作)。
  • 应用:广泛用于拼写检查、DNA序列比对和自然语言处理中。

4. 海明距离 (Hamming Distance)

  • 定义:海明距离用于衡量两个等长字符串之间的差异,即在相同位置上不同字符的数量。
  • 应用:主要用于编码理论和信息技术中的错误检测和纠正,例如校验和比较二进制字符串。

3 LSH函数家族

算法定义中心思想核心公式优点缺点应用场景
MinHash LSH用于集合相似性的LSH方法通过最小哈希签名计算集合的Jaccard相似度 h ( A ) = min ⁡ ( { h i ( x ) ∣ x ∈ A } ) h(A) = \min(\{h_i(x) \mid x \in A\}) h(A)=min({hi(x)xA})高效处理集合相似性,减少计算量需要预计算最小哈希签名文档去重,集合相似性计算
SimHash用于文本和文档相似性的LSH方法将高维向量降维为短签名,保留方向信息 s = sign ( ∑ w i x i ) s = \text{sign}(\sum w_i x_i) s=sign(wixi)适合处理高维数据,方向不变性不适合处理完全不同的文本文本检索,文档相似性计算
p-stable LSH用于欧氏距离的LSH方法基于p-stable分布投影到低维空间 h ( x ) = ⌊ a ⋅ x + b r ⌋ h(x) = \lfloor \frac{a \cdot x + b}{r} \rfloor h(x)=rax+b准确近似欧氏距离,适合高维数值数据投影精度依赖于维度选择图像检索,数值数据相似性计算
Bit Sampling LSH用于汉明距离的LSH方法从二进制字符串中随机选择位作为特征直接位选择简单高效,直接操作二进制数据仅适合固定长度的二进制数据二进制数据比较,错误检测和校验

http://www.kler.cn/a/527874.html

相关文章:

  • CRC校验详解
  • Autogen_core源码:_agent_instantiation.py
  • 二级C语言:二维数组每行最大值与首元素交换、删除结构体的重复项、取出单词首字母
  • 基于互联网+智慧水务信息化整体解决方案
  • 毕业设计--具有车流量检测功能的智能交通灯设计
  • 表格结构标签
  • 文献阅读 250131-Global Carbon Budget 2023(1)
  • 如何成为一名 Python 全栈工程师攻略
  • 加一(66)
  • CSS 中调整元素大小的全面指南
  • 人工智能|基本概念|人工智能相关重要概念---AI定义以及模型相关知识
  • 【Nacos】配置中心
  • Rust 条件语句
  • 仿真设计|基于51单片机的景区人数管理系统仿真
  • android安卓用Rime
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.29 内存奥秘:跨语言内存管理实战
  • 智能码二维码的成本效益分析
  • MySQL数据库(二)- SQL
  • 算法随笔_33: 132模式
  • deepseek核心技术:MLA架构-多头潜在注意力
  • python 使用Whisper模型进行语音翻译
  • canvas的基本用法
  • @EventListener底层原理(超详细)| @TransactionalEventListener底层原理 | 事务同步
  • 列表导出功能
  • 深度解析:网站快速收录与服务器性能的关系
  • DeepSeek的介绍