相似度度量方法,相关实现代码使用python
导包
import numpy as np
from scipy.spatial.distance import euclidean
from sklearn.metrics.pairwise import euclidean_distances
一、距离度量方法:
这类方法基于距离的概念来衡量对象之间的相似度。距离度量方法通常适用于数值型数据,通过计算距离来衡量对象之间的相似程度,距离越小表示相似度越高。
给定样本集合X,X是m维实数向量空间 R m R^m Rm中点的集合,其中 x i , x j ∈ X , x i = ( x 1 i , x 2 i , ⋯ , x m i ) T , x j = ( x 1 j , x 2 j , ⋯ , x m j ) T x_i,x_j\in X,x_i=(x_{1i},x_{2i},\cdots,x_{mi})^T,x_j=(x_{1j},x_{2j},\cdots,x_{mj})^T xi,xj∈X,xi=(x1i,x2i,⋯,xmi)T,xj=(x1j,x2j,⋯,xmj)T。
1.闵可夫斯距离(Minkowski Distance):
样本 x i x_i xi与 x j x_j xj的闵可夫斯距离定义为:
d
i
j
=
(
∑
k
=
1
m
∣
x
k
i
−
x
k
j
∣
p
)
1
p
d_{ij}=(\sum_{k=1}^m{|x_{ki}-x_{kj}|}^p)^{\frac{1}{p}}
dij=(k=1∑m∣xki−xkj∣p)p1
这里
p
≥
1
p\ge1
p≥1。
(1).欧几里得距离(Euclidean Distance):
当p=2时称为欧几里得距离,简称欧氏距离,计算两个向量之间的欧氏距离,即它们之间的直线距离,欧氏距离的定义为:
d
i
j
=
(
∑
k
=
1
m
∣
x
k
i
−
x
k
j
∣
2
)
1
2
d_{ij}=(\sum_{k=1}^m{|x_{ki}-x_{kj}|}^2)^{\frac{1}{2}}
dij=(k=1∑m∣xki−xkj∣2)21
计算两个向量之间的欧式距离
# 计算两个向量之间的欧式距离
def eucliDist(A,B):
return np.sqrt(np.sum(np.power((A - B), 2)))
#numpy库计算欧式距离
def eucliDist_np(A,B):
return np.linalg.norm(A-B)
#scipy库计算欧式距离
def eucliDist_sp(A,B):
return euclidean(A,B)
#sklearn库计算欧式距离
def eucliDist_sl(A,B):
return euclidean_distances(A,B)
计算二维矩阵与一维向量之间的欧式距离,需要矩阵大小与向量大小匹配
#计算向量与矩阵的列向量之间的欧式距离
def calculate_col_distances(matrix, vector):
"""
Args:
matrix: shape为m*n
vector: 长度为m
Returns:
向量与矩阵的列向量之间的欧式距离,结果长度为n
"""
diff = matrix.reshape((-1,len(vector))) - vector # 计算差向量
distances = np.linalg.norm(diff, axis=0) # 计算范数
return distances
#计算向量与矩阵的行向量之间的欧式距离
def calculate_row_distances(matrix, vector):
"""
Args:
matrix: shape为m*n
vector: 长度为n
Returns:
向量与矩阵的列向量之间的欧式距离,结果长度为m
"""
diff = matrix- vector # 计算差向量
distances = np.linalg.norm(diff, axis=0) # 计算范数
return distances
(2).曼哈顿距离(Manhattan Distance):
当p=1时称为曼哈顿距离。计算两个向量之间的曼哈顿距离,即它们之间的城市街区距离(各个维度的差值的绝对值之和)。曼哈顿距离的定义为:
d
i
j
=
∑
k
=
1
m
∣
x
k
i
−
x
k
j
∣
d_{ij}=\sum_{k=1}^m{|x_{ki}-x_{kj}|}
dij=k=1∑m∣xki−xkj∣
(3).切比雪夫距离(Chebyshev Distance):
当p=
∞
\infty
∞时称为切比雪夫距离,取各个坐标数值差的绝对值的最大值,切比雪夫距离的定义为:
d
i
j
=
max
k
∣
x
k
i
−
x
k
j
∣
d_{ij}=\max_k{|x_{ki}-x_{kj}|}
dij=kmax∣xki−xkj∣
2.马哈拉诺比斯距离(Mahalanobis Distance):
马哈拉诺比斯距离,简称马氏距离,考虑各个分量(特征)之间的相关性并与各个分量的尺度无关。马哈拉诺比斯距离越大相似度越小,距离越小相似度越大。
给定一个样本集合 X , X = [ x i j ] m × n X,X =[x_{ij}]_{m×n} X,X=[xij]m×n,其协方差矩阵记作 S。样本 x i x_i xi与样本 x j x_j xj 之间的马哈拉诺比斯距离 d i j d_{ij} dij定义为:
d
i
j
=
[
(
x
i
−
x
j
)
T
S
−
1
(
x
i
−
x
j
)
]
1
2
d_{ij}=[(x_i-x_j)^TS^{-1}(x_i-x_j)]^{\frac{1}{2}}
dij=[(xi−xj)TS−1(xi−xj)]21
其中
x
i
=
(
x
1
i
,
x
2
i
,
⋯
,
x
m
i
)
T
,
x
j
=
(
x
1
j
,
x
2
j
,
⋯
,
x
m
j
)
T
x_i=(x_{1i},x_{2i},\cdots,x_{mi})^T, x_j=(x_{1j},x_{2j},\cdots,x_{mj})^T
xi=(x1i,x2i,⋯,xmi)T,xj=(x1j,x2j,⋯,xmj)T
当S为单位矩阵时,即样本数据的各个分量互相独立且各个分量的方差为1时,由马氏距离的定义可知马氏距离就是欧氏距离,所以马氏距离是欧氏距离的推广。
二、内积度量方法:
这类方法基于向量之间的内积来衡量相似度。
余弦相似度(Cosine Similarity):
计算两个向量之间的夹角余弦值,用于衡量它们的方向相似性,余弦相似度越接近1表示相似度越高,越接近0相似度越低。对于样本
x
i
x_i
xi与样本
x
j
x_j
xj之间的夹角余弦定义为:
s
i
j
=
∑
k
=
1
m
x
k
i
x
k
j
[
∑
k
=
1
m
x
k
i
2
∑
k
=
1
m
x
k
j
2
]
1
2
s_{ij}=\frac{\sum_{k=1}^m{x_{ki}}x_{kj}}{[\sum_{k=1}^m{x^2_{ki}}\sum_{k=1}^m{x^2_{kj}}]^{\frac{1}{2}}}
sij=[∑k=1mxki2∑k=1mxkj2]21∑k=1mxkixkj
或
s
i
j
=
x
i
⋅
x
j
∣
∣
x
i
∣
∣
∗
∣
∣
x
j
∣
∣
s_{ij}=\frac{x_i\cdot x_j} { ||x_i|| * ||x_j||}
sij=∣∣xi∣∣∗∣∣xj∣∣xi⋅xj
其中
x
i
⋅
x
j
x_i\cdot x_j
xi⋅xj表示向量的内积,
∣
∣
x
∣
∣
||x||
∣∣x∣∣和
∣
∣
y
∣
∣
||y||
∣∣y∣∣分别表示向量的范数。
三、相关系数方法
这类方法基于统计的相关性概念来衡量对象之间的相似度。
皮尔逊相关系数(Pearson Correlation Coefficient):
用于衡量两个变量之间的线性相关程度,相关系数的绝对值越接近于1,表示样本越相似,越接近于0,表示样本越不相似。对于两个m维向量 x i x_i xi与 x j x_j xj,相关系数定义为:
r
i
j
=
∑
k
=
1
m
(
x
k
i
−
x
ˉ
i
)
(
x
k
j
−
x
ˉ
j
)
[
∑
k
=
1
m
(
x
k
i
−
x
ˉ
i
)
2
∑
k
=
1
m
(
x
k
j
−
x
ˉ
j
)
2
]
1
2
r_{ij}=\frac{\sum_{k=1}^m{(x_{ki}-\bar{x}_i)}(x_{kj}-\bar{x}_j)}{[\sum_{k=1}^m{(x_{ki}-\bar{x}_i)^2}\sum_{k=1}^m{(x_{kj}-\bar{x}_j)^2}]^{\frac{1}{2}}}
rij=[∑k=1m(xki−xˉi)2∑k=1m(xkj−xˉj)2]21∑k=1m(xki−xˉi)(xkj−xˉj)
其中
x
ˉ
i
=
1
m
∑
k
=
1
m
x
k
i
,
x
ˉ
j
=
1
m
∑
k
=
1
m
x
k
j
\bar{x}_i=\frac1m\sum_{k=1}^m{x_{ki}},\bar{x}_j=\frac1m\sum_{k=1}^m{x_{kj}}
xˉi=m1k=1∑mxki,xˉj=m1k=1∑mxkj
或:
r
i
j
=
c
o
v
(
x
i
,
x
j
)
s
t
d
(
x
i
)
∗
s
t
d
(
x
j
)
r_{ij}=\frac{cov(x_i,x_j)}{std(x_i) * std(x_j)}
rij=std(xi)∗std(xj)cov(xi,xj)
其中
c
o
v
(
x
i
,
x
j
)
cov(x_i,x_j)
cov(xi,xj)表示
x
i
x_i
xi和
x
j
x_j
xj的协方差,
s
t
d
(
x
i
)
std(x_i)
std(xi)和
s
t
d
(
x
j
)
std(x_j)
std(xj)分别表示
x
i
x_i
xi和
x
j
x_j
xj的标准差。
四、集合相似度方法
这类方法主要用于比较集合之间的相似度。
Jaccard相似度(Jaccard Similarity):
主要用于计算集合之间的相似度。对于两个集合A和B,Jaccard相似度可以表示为:sim(A, B) = |A∩B| / |A∪B|,其中|A∩B|表示A和B的交集的元素个数,|A∪B|表示A和B的并集的元素个数。