常见距离计算的Python实现
常见的距离有曼哈顿距离、欧式距离、切比雪夫距离、闵可夫斯基距离、汉明距离、余弦距离等,用Python实现计算的方式有多种,可以直接构造公式计算,也可以利用内置线性代数函数计算,还可以利用scipy库计算。
1.曼哈顿距离
也叫城市街区距离,是两点差向量的L1范数,也就是各元素的绝对值之和。A(x1,x2,…,xn)和B(y1,y2,…,yn)之间的曼哈顿距离表示为
\[d=\sum_{i=1}^{n}{\left| x_i-y_i \right|}
\]
Python实现:
import numpy as np
from scipy.spatial import distance
A = np.array([1,2,3])
B = np.array([4,5,6])
# 方式一:直接构造公式计算
dist1 = np.sum(np.abs(A-B))
# 方式二:内置线性代数函数计算
dist2 = np.linalg.norm(A-B,ord=1) #ord为范数类型,取值1(一范数),2(二范数),np.inf(无穷范数),默认2。
# 方式三:scipy库计算
dist3 = distance.cityblock(A,B)
2.欧式距离
是一种最常见的距离,也就是两点差向量的L2范数。A(x1,x2,…,xn)和B(y1,y2,…,yn)之间的欧式距离表示为
\[d=\sqrt{\sum_{i=1}^{n}{\left( x_i-y_i \right)^{2}}}
\]
Python实现:
import numpy as np
from scipy.spatial import distance
A = np.array([1,2,3])
B = np.array([4,5,6])
# 方式一:直接构造公式计算
dist1 = np.sqrt(np.sum((A-B)**2))
# 方式二:内置线性代数函数计算
dist2 = np.linalg.norm(A-B,ord=2)
# 方式三:scipy库计算
dist3 = distance.euclidean(A,B)
3.切比雪夫距离
最大的维度内距离,是两点差向量的无穷范数。A(x1,x2,…,xn)和B(y1,y2,…,yn)之间的切比雪夫距离表示为
\[d=max\left( \left| x_i-y_i \right| \right)
\]
Python实现:
import numpy as np
from scipy.spatial import distance
A = np.array([1,2,3])
B = np.array([4,5,6])
# 方式一:直接构造公式计算
dist1 = np.max(np.abs(A-B))
# 方式二:内置线性代数函数计算
dist2 = np.linalg.norm(A-B,ord=np.inf)
# 方式三:scipy库计算
dist3 = distance.chebyshev(A,B)
4. 闵可夫斯基距离
是一种范式距离的统称,可表示为两点差向量的Lp范数。A(x1,x2,…,xn)和B(y1,y2,…,yn)之间的闵可夫斯基距离表示为
\[d=\sqrt[p]{\sum_{i=1}^{n}{\left| x_i-y_i \right|^{p}}}
\]
Python实现:
import numpy as np
from scipy.spatial import distance
A = np.array([1,2,3])
B = np.array([4,5,6])
# 方式一:内置线性代数函数计算
dist1 = np.linalg.norm(A-B,ord=3) # np.linalg.norm(A-B,ord=p)
# 方式二:scipy库计算
dist2 = distance.minkowski(A,B,3) # distance.minkowski(A,B,p)
5.汉明距离
衡量两个字符串之间的差异程度,对两个对象的向量元素逐个比较,差异的个数占总个数的比例。A(x1,x2,…,xn)和B(y1,y2,…,yn)之间的汉明距离表示为
\[d=\frac{1}{n}\sum_{i=1}^{n}{I\left( x_i\ne y_i \right)}
\]
其中I为指示函数,
\[\begin{equation} I= \left\{ \begin{array}{lr} 1 \quad if\left( x_i\ne y_i \right)&\\ 0 \quad if\left( x_i = y_i\right) \end{array} \right. \end{equation}
\]
Python实现:
import numpy as np
from scipy.spatial import distance
A = np.array([1,2,3])
B = np.array([4,5,6])
# 方式一:scipy库计算
dist1 = distance.hamming(A,B)
6.余弦距离
也叫余弦相似度,是两点空间向量夹角的余弦值,是内积与模积的比值,用来衡量两向量间的差异程度。A(x1,x2,…,xn)和B(y1,y2,…,yn)之间的余弦距离表示为
\[\begin{align}
d&=cos\theta=\frac{<A,B>}{\left| A \right|\cdot\left| B \right|} \\
&=\frac{\sum_{i=1}^{n}{x_iy_i}}{\sqrt{\sum_{i=1}^{n}{x_i^{2}}}\cdot\sqrt{\sum_{i=1}^{n}{y_i^{2}}}}
\end{align}\]
Python实现:
import numpy as np
from scipy.spatial import distance
A = np.array([1,2,3])
B = np.array([4,5,6])
# 方式一:直接构造公式计算
dist1 = np.sum(A*B)/(np.sqrt(np.sum(A**2))*np.sqrt(np.sum(B**2)))
# 方式二:scipy库计算
dist2 = 1-distance.cosine(A,B)
End.