资讯专栏INFORMATION COLUMN

8种相似度度量方式的原理及实现

lewif / 3481人阅读

摘要:实现参考链接计算各类距离关于机器学习距离的理解机器学习中的相似性度量如何通俗易懂地理解皮尔逊相关系数数学应用

8种相似度度量方式的原理及实现 欧氏距离(Euclidean Distance)
欧氏距离(也称欧几里得度量)指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)

计算公式

$$dist(A,B)=sqrt{sum_{i=1}^n(A_i-B_i)^2}$$

试用场景

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

python实现
import numpy as np


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

d = np.linalg.norm(vec1-vec2, ord=2)
# 或者
d = np.sqrt(np.sum(np.square(vec1-vec2)))

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

计算公式

$$dist(A,B)=sum_{i=1}^n|A_i-B_i|$$

试用场景

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

python实现
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))

切比雪夫距离(Chebyshev Distance)
切比雪夫距离(Chebyshev distance)是向量空间中的一种度量,二个点之间的距离定义为其各座标数值差的最大值

计算公式

$$dist(A,B)=max_i|A_i-B_i|$$
or
$$dist(A,B)=lim_{p→infty}(sum_{i=1}^n|A_i-B_i|^p)^{frac{1}{p}}$$

试用场景

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

python实现
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()

闵可夫斯基距离(Minkowski Distance)
欧氏空间中的一种测度,被看做是欧氏距离和曼哈顿距离的一种推广

计算公式

$$dist(A,B)=sqrt[p]{sum_{i=1}^n|A_i-B_i|^p}$$

试用场景

当 $p=1$ 时,就是曼哈顿距离

当 $p=2$ 时,就是欧氏距离

当 $p→∞$ 时,就是切比雪夫距离

python实现
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)

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

计算公式

$$dist(A,B)=sum_{i=0}^n{A[i]igoplus B[i]}$$

试用场景

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

python实现
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]

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

计算公式

$$cos( heta)=cfrac{Acdot B}{|A||B|}$$
or
$$cos( heta)=cfrac{sum_{i=1}^nA_iB_i}{sqrt{sum_{i=1}^nA_i^2}sqrt{sum_{i=1}^nB_i^2}}$$

试用场景

衡量两个向量方向的差异

python实现
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)))

皮尔森相关系数(Pearson Correlation Coefficient)
用于度量两个变量之间的相关程度

计算公式

$$P(A,B)=cfrac{sum_{i=1}^n(A_i-overline A)(B_i-overline B)}{sqrt{sum_{i=1}^n(A_i-overline A)^2sum_{i=1}^n(B_i-overline B)^2}}$$

试用场景

反映两个变量是正相关还是负相关

python实现
import numpy as np

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

p = np.corrcoef(vec1, vec2)

杰卡德相似系数(Jaccard Similarity Coefficient)及杰卡德距离(Jaccard Distance)
用于比较有限样本集之间的相似性与差异性

杰卡德相似系数计算公式

$$J(A,B)=cfrac{|Aigcap B|}{|Aigcup B|}$$

杰卡德距离计算公式

$$J_delta(A,B)=1-J(A,B)=cfrac{|Aigcup B|-|Aigcap B|}{|Aigcup B|}$$

试用场景

比较文本相似度,用于文本查重与去重;

计算对象间距离,用于数据聚类或衡量两个集合的区分度等。

python实现
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")


参考链接

Python Numpy计算各类距离

关于机器学习距离的理解

机器学习中的相似性度量

如何通俗易懂地理解皮尔逊相关系数

GeoGebra 数学应用

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43885.html

相关文章

  • 推荐系统01--余弦相似

    摘要:在近邻推荐中,最常用的相似度是余弦相似度。这就是由于余弦相似度被向量长度归一化后的结果。用余弦相似度计算出来,两个用户的相似度达到。余弦相似度适用于评分数据,杰卡德相似度适合用于隐式反馈数据。 今天,我们来聊聊协同过滤中的相似度计算方法有哪些。相似度的本质推荐系统中,推荐算法分为两个门派,一个是机器学习派,另一个就是相似度门派。机器学习派是后起之秀,而相似度派则是泰山北斗,以致撑起来推...

    cncoder 评论0 收藏0

发表评论

0条评论

lewif

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<