常见的相似度计算方式

1.欧氏距离(Euclidean Distance)

欧氏距离(也称欧几里得度量)指在 m m m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。 在二维和三维空间中的欧氏距离就是两点之间的实际距离。

在这里插入图片描述

计算公式:
d i s t ( A , B ) = ∑ i = 1 n ( A i − B i ) 2 dist(A,B)=\sqrt{\sum\limits^n\limits_{i=1}(A_i-B_i)^2} dist(A,B)=i=1n(AiBi)2
理解欧氏距离的比较通俗的一种方式,是通过二维向量的距离来进行理解。直观上的感觉,某个点到另一个点的直线距离

使用场景:

  • 在数据完整(无维度数据缺失)的情况下, 维度间的衡量单位是一致的, 否则需要标准化处理

随着数据维度的增加,欧几里得距离的作用就越小 。

import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])
# x_norm=np.linalg.norm(x, ord=None, axis=None, keepdims=False)
# x: 表示矩阵(也可以是一维),ord:范数类型
d = np.linalg.norm(vec1-vec2, ord=2)
# 或者
d = np.sqrt(np.sum(np.square(vec1-vec2)))

2.曼哈顿距离(Manhattan Distance)

在欧几里得空间的固定直角坐标系上两点所形成的线段对轴产生的投影的距离总和。

在这里插入图片描述

计算公式
d i s t ( A , B ) = ∑ i = 1 n ∣ A i − B i ∣ dist(A,B)=\sum\limits^n\limits_{i=1}|A_i-B_i| dist(A,B)=i=1nAiBi
使用场景

  • 在数据完整(无维度数据缺失)的情况下, 需要将空间划分成网格, 然后以网格为单位来进行度量, 允许4个方向
import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])
 
d = np.linalg.norm(vec1-vec2, ord=1)
# 或者
d = np.sum(np.abs(vec1-vec2))

3.切比雪夫距离(Chebyshev Distance)

切比雪夫距离(Chebyshev distance)是向量空间中的一种度量,二个点之间的距离定义为其各坐标数值差的最大值 。 此距离中,加入了优化的成分,通过最值来定义距离。

在这里插入图片描述

计算公式
d i s t ( A , B ) = max ⁡ i ∣ A i − B i ∣ dist(A,B)=\max\limits_i|A_i-B_i| dist(A,B)=imaxAiBi

d i s t ( A , B ) = lim ⁡ p → ∞ ( ∑ i = 1 n ∣ A i − B i ∣ p ) 1 p dist(A,B)=\lim\limits_{p \to \infty}\left(\sum\limits^n\limits_{i=1}|A_i-B_i|^p\right)^{\frac{1}{p}} dist(A,B)=plim(i=1nAiBip)p1

使用场景

  • 需要将空间划分成网格, 然后以网格为单位来进行度量, 允许8个方向
import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])

d = np.linalg.norm(vec1-vec2, ord=np.inf)
# 或者
d = np.abs(vec1-vec2).max()

4.闵可夫斯基距离(Minkowski Distance)

闵氏距离不是一种距离,而是一组距离的定义
在这里插入图片描述

计算公式
d i s t ( A , B ) = p ∑ i = 1 n ∣ A i − B i ∣ p dist(A,B)=p\sqrt{\sum\limits^n\limits_{i=1}|A_i-B_i|^p} dist(A,B)=pi=1nAiBip
使用场景

  • p = 1 p=1 p=1 时,就是曼哈顿距离
  • p = 2 p=2 p=2 时,就是欧氏距离
  • p → ∞ p→∞ p 时,就是切比雪夫距离

闵氏距离的缺点主要有两个:

(1)将各个分量的量纲(scale),也就是“单位”当作相同的看待了。

(2)没有考虑各个分量的分布(期望,方差等)可能是不同的。

import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])

"""
ord=1: 一范数
ord=2: 二范数
ord=np.inf: 无穷范数
"""
d = np.linalg.norm(vec1-vec2, ord=arg)

5.汉明距离(Hamming Distance)

在信息论中,两个等长字符串之间的汉明距离(Hamming distance)是两个字符串对应位置的不同字符的个。

在这里插入图片描述
)]

计算公式
d i s t ( A , B ) = ∑ i = 0 n A [ i ] ⊕ B [ i ] dist(A,B)=\sum\limits^n\limits_{i=0}A[i]\oplus B[i] dist(A,B)=i=0nA[i]B[i]
使用场景

  • 信息编码(为了增强容错性,应使得编码间的最小汉明距离尽可能大)

当两个向量的长度不相等时,汉明距离很难使用。

import numpy as np

vec1 = np.array([1, 1, 0, 1, 0, 1, 0, 0, 1])
vec2 = np.array([0, 1, 1, 0, 0, 0, 1, 1, 1])

d = len(np.nonzero(vec1-vec2)[0])
# 或者
d = np.shape(np.nonzero(vec1-vec2)[0])[0]

6.余弦相似度(Cosine Similarity)

余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度

计算公式
d i s t ( A , B ) = A ⋅ B ∣ A ∣ ∣ B ∣ dist(A,B)=\frac{A · B}{|A||B|} dist(A,B)=A∣∣BAB

d i s t ( A , B ) = ∑ i = 1 n A i B i ∑ i = 1 n A i 2 ∑ i = 1 n B i 2 dist(A,B)=\frac{\sum\limits^n\limits_{i=1}A_iB_i}{\sqrt{\sum\limits^n\limits_{i=1}A^2_i}\sqrt{\sum\limits^n\limits_{i=1}B^2_i}} dist(A,B)=i=1nAi2 i=1nBi2 i=1nAiBi

使用场景

  • 衡量两个向量方向的差异(不考虑大小) 以推荐系统为例,那么余弦相似性并没有考虑到不同用户之间的评分等级差异。
import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])

d = np.dot(vec1,vec2)/(np.linalg.norm(vec1)*(np.linalg.norm(vec2)))

Q:余弦相似度有没有什么问题?

在推荐场景下,现有用户-物品评分矩阵,给用户推荐相似物品,没有考虑到不同用户对物品的平均打分的偏差情况。举个栗子:假如一个用户的品味很高,给每个推荐的物品打分均很低,则此用户很难与其他用户相似。

解决方法:引入偏置(皮尔逊相关系数)

7.皮尔森相关系数(Pearson Correlation Coefficient)

用于度量两个变量之间的相关程度
在这里插入图片描述

计算公式
P ( A , B ) = ∑ i = 1 n ( A i − A ‾ ) ( B i − B ‾ ) ∑ i = 1 n ( A i − A ‾ ) 2 ∑ i = 1 n ( B i − B ‾ ) 2 P(A,B)=\frac{\sum\limits^n\limits_{i=1}(A_i-\overline A)(B_i-\overline B)}{\sqrt{\sum\limits^n\limits_{i=1}(A_i-\overline A)^2}\sqrt{\sum\limits^n\limits_{i=1}(B_i-\overline B)^2}} P(A,B)=i=1n(AiA)2 i=1n(BiB)2 i=1n(AiA)(BiB)
使用场景

  • 反映两个变量是正相关还是负相关
import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])

p = np.corrcoef(vec1, vec2)

P的取值在-1与1之间。取值为1时,表示两个随机变量之间呈完全正相关关系;取值为-1时,表示两个随机变量之间呈完全负相关关系;取值为0时,表示两个随机变量之间线性无关。

8.杰卡德相似系数(Jaccard Similarity Coefficient)

用于比较有限样本集之间的相似性与差异性,两个总结:数数

在这里插入图片描述

计算公式
J ( A , B ) = ∣ A ⋂ B ∣ ∣ A ⋃ B ∣ J(A,B)=\frac{|A\bigcap B|}{|A\bigcup B|} J(A,B)=ABAB
举个栗子: 假设样本 A A A 和样本 B B B 是两个 n n n 维向量,而且所有维度的取值都是 0 0 0 1 1 1。例如, A   ( 0 , 1 , 1 , 0 ) A\ (0,1,1,0) A (0,1,1,0) B   ( 1 , 0 , 1 , 1 ) B\ (1,0,1,1) B (1,0,1,1) 。我们将样本看成一个集合, 1 1 1表示集合包含该元素, 0 0 0表示集合不包含该元素。

p p p:样本 A A A B B B 都是 1 1 1 的维度的个数

q q q:样本 A A A 1 1 1 B B B 0 0 0 的维度的个数

r r r:样本 A A A 0 0 0 B B B 1 1 1 的维度的个数

s s s:样本 A A A B B B 都是 0 0 0 的维度的个数

那么样本A与B的杰卡德相似系数可以表示为:
J = p p + q + r J=\frac{p}{p+q+r} J=p+q+rp
此处分母之所以不加s的原因在于

对于杰卡德相似系数来说,它处理的都是非对称二元变量。非对称的意思是指状态的两个输出不是同等重要的,例如,疾病检查的阳性和阴性结果。

使用场景

  • 比较文本相似度,用于文本查重与去重;
  • 计算对象间距离,用于数据聚类或衡量两个集合的区分度等。
import numpy as np
import scipy.spatial.distance as dist

vec1 = np.array([1, 1, 0, 1, 0, 1, 0, 0, 1])
vec2 = np.array([0, 1, 1, 0, 0, 0, 1, 1, 1])

d = dist.pdist(np.array([vec1, vec2]), "jaccard")

Q:杰卡德相似度的缺点:

杰卡德相似度算法没有考虑向量中潜在数值的大小,而是简单的处理为0和1,会导致信息的损失。

本文仅作为学习记录所用,不用作商业用途,谢谢理解。

参考:https://segmentfault.com/a/1190000019307297

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
对于大规模文本相似度计算,可以采用以下步骤: 1. 数据预处理:首先,对文本数据进行预处理,包括分词、去除停用词、词干化或词形还原等操作。这有助于减少噪音和提取重要特征。 2. 特征表示:将文本转换为计算机可处理的特征表示形式。常用的方法包括词袋模型、TF-IDF表示、词嵌入(如Word2Vec、GloVe)等。根据具体任务和文本特点,选择合适的特征表示方法。 3. 相似度计算:根据选择的特征表示方法,使用相应的相似度计算方法来衡量文本之间的相似度。常用的相似度计算方法包括余弦相似度、欧氏距离、编辑距离等。可以使用库函数或自定义函数来计算相似度。 4. 数据存储和索引:对于大规模文本数据,为了提高查询效率,通常需要使用索引技术进行存储和检索。可以使用倒排索引、近似最近邻索引(如LSH、HNSW)等来加速相似度查询过程。 5. 相似度匹配:根据具体任务需求,采用合适的匹配算法来寻找相似的文本。常见的匹配算法包括最近邻搜索、聚类、图匹配等。 6. 结果评估:对计算得到的文本相似度进行评估,可以使用人工标注的相似度作为参考,计算精确度、召回率、F1分数等指标。 在处理大规模文本相似度计算时,还需要考虑计算效率和资源消耗。可以采用并行计算、分布式计算、近似计算等方法来提高计算效率。此外,对于特别大规模的数据,可以采用采样或分割数据集的方式进行处理,以减少计算量和内存占用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值