本文介绍Python计算欧式距离和余弦相似度。为了余弦相似度需要使用欧式距离,我们首先介绍欧式距离。
欧式距离
欧式距离标识两个向量之间的距离,计算公式如下:
欧式距离 = Σ ( A i − B i ) 2 \sqrt{Σ(A_i-B_i)^2} Σ(Ai−Bi)2
python计算欧式距离,可以使用numpy.linalg.norm函数:
# 导入包
import numpy as np
from numpy.linalg import norm
# 定义向量
a = np.array([2, 6, 7, 7, 5, 13, 14, 17, 11, 8])
b = np.array([3, 5, 5, 3, 7, 12, 13, 19, 22, 7])
# 计算两个向量的欧式距离
norm(a-b)
# 12.409673645990857
输出结果显示两个向量的欧式距离为:12.409673645990857
如果两个向量长度不等,函数会产生警告:
import numpy as np
from numpy.linalg import norm
a = np.array([2, 6, 7, 7, 5, 13, 14])
b = np.array([3, 5, 5, 3, 7, 12, 13, 19, 22, 7])
norm(a-b)
# 产生错误信息,不能广播
# ValueError: operands could not be broadcast together with shapes (7,) (10,)
也可以针对数据框的列计算欧式距离:
import pandas as pd
import numpy as np
from numpy.linalg import norm
# 定义数据框
df = pd.DataFrame({'points': [25, 12, 15, 14, 19, 23, 25, 29],
'assists': [5, 7, 7, 9, 12, 9, 9, 4],
'rebounds': [11, 8, 10, 6, 6, 5, 9, 12]})
# 在 'points' 和 'assists' 两列之间计算欧式距离
norm(df['points'] - df['assists'])
# 40.496913462633174
余弦相似度
余弦相似度用向量空间中两向量夹角的余弦值作为衡量两个向量间差异程度。余弦值越接近1,表明两个向量的夹角越接近0度,则两个向量越相似。
计算公式如下:
余弦相似度=
Σ
A
i
B
i
/
(
Σ
A
i
2
Σ
B
i
2
)
{ ΣA_iB_i /(\sqrt{ΣA_i^2}\sqrt{ΣB_i^2}})
ΣAiBi/(ΣAi2ΣBi2)
下面介绍如何使用NumPy库计算两个向量的余弦相似度。
from numpy import dot
from numpy.linalg import norm
# 定义数组
a = [23, 34, 44, 45, 42, 27, 33, 34]
b = [17, 18, 22, 26, 26, 29, 31, 30]
# 计算余弦相似度
cos_sim = dot(a, b)/(norm(a)*norm(b))
cos_sim
0.965195008357566
norm函数计算欧式距离,dot计算向量点积。
对于更长数组长度也可以使用该方法:
import numpy as np
from numpy import dot
from numpy.linalg import norm
# 定义数组
a = np.random.randint(10, size=100)
b = np.random.randint(10, size=100)
# 计算余弦相似度
cos_sim = dot(a, b)/(norm(a)*norm(b))
cos_sim
0.7340201613960431
最后需要说明的是,如果长度不一致仍会报错。