📅  最后修改于: 2023-12-03 15:23:27.010000             🧑  作者: Mango
在机器学习、数据挖掘等领域,经常需要计算两个点之间的距离。在低维空间中,通常使用欧氏距离计算两点之间的距离。但在高维空间中,欧氏距离容易产生维数灾难(curse of dimensionality)的问题,为了避免这个问题,我们需要使用其他的距离度量方法。
本文介绍几种常见的多维距离度量方法,并给出Python中计算两个多维点之间距离的代码实现。
欧氏距离(Euclidean distance)是计算两个点之间的距离的一种常用方法,公式如下:
$$d(p,q) = \sqrt{\sum_{i=1}^{n}(q_i-p_i)^2}$$
其中 $p$ 和 $q$ 分别表示两个$n$ 维向量,$p_i$ 表示向量 $p$ 的第 $i$ 个分量。
在Python中可以使用numpy库中的linalg.norm函数来计算欧氏距离。
import numpy as np
p = np.array([1,2,3])
q = np.array([4,5,6])
euclidean_distance = np.linalg.norm(p - q)
print("欧氏距离: ", euclidean_distance)
曼哈顿距离(Manhattan distance)也是一种常用的距离度量方法,它在计算两点之间的距离时不考虑两点连线的斜率,而是计算两个向量在坐标系上的绝对距离之和,公式如下:
$$d(p,q) = \sum_{i=1}^{n}|q_i-p_i|$$
在Python中可以使用numpy库中的sum函数来计算曼哈顿距离。
import numpy as np
p = np.array([1,2,3])
q = np.array([4,5,6])
manhattan_distance = np.sum(np.abs(p - q))
print("曼哈顿距离: ", manhattan_distance)
切比雪夫距离(Chebyshev distance)是一种基于“棋盘距离”的距离度量方法,它计算两个向量中每一维之间的差值的绝对值的最大值,公式如下:
$$d(p,q) = \max_{i=1}^{n}|q_i-p_i|$$
在Python中可以使用numpy库中的max函数来计算切比雪夫距离。
import numpy as np
p = np.array([1,2,3])
q = np.array([4,5,6])
chebyshev_distance = np.max(np.abs(p - q))
print("切比雪夫距离: ", chebyshev_distance)
闵可夫斯基距离(Minkowski distance)是一种更加通用的距离度量方法,它可以重用欧氏距离、曼哈顿距离、切比雪夫距离等多种方法。公式如下:
$$d(p,q) = (\sum_{i=1}^{n}|q_i-p_i|^p)^{1/p}$$
当 $p=1$ 时,是曼哈顿距离;当 $p=2$ 时,是欧氏距离;当 $p=\infty$ 时,是切比雪夫距离。
在Python中可以使用numpy库中的power函数和sum函数来计算闵可夫斯基距离。
import numpy as np
p = np.array([1,2,3])
q = np.array([4,5,6])
p_distance = 3
minkowski_distance = np.power(np.sum(np.power(np.abs(p - q), p_distance)), 1/p_distance)
print("闵可夫斯基距离: ", minkowski_distance)
下面给出一个函数,可以计算两个多维点之间的距离。
import numpy as np
def distance(p, q, distance_type=2):
"""
计算两个多维点之间的距离
:param p: 多维点p
:param q: 多维点q
:param distance_type: 距离度量方法,默认为2,即欧氏距离
:return: 两个多维点之间的距离
"""
if distance_type == 1:
# 曼哈顿距离
return np.sum(np.abs(p - q))
elif distance_type == 2:
# 欧氏距离
return np.linalg.norm(p - q)
elif distance_type == 3:
# 切比雪夫距离
return np.max(np.abs(p - q))
else:
# 闵可夫斯基距离
return np.power(np.sum(np.power(np.abs(p - q), distance_type)), 1/distance_type)
该函数接受三个参数:两个多维点和距离度量方法,如果不指定距离度量方法,默认使用欧氏距离。
p = np.array([1,2,3])
q = np.array([4,5,6])
# 计算欧氏距离
print(distance(p, q)) # 5.196152422706632
# 计算曼哈顿距离
print(distance(p, q, distance_type=1)) # 9
# 计算切比雪夫距离
print(distance(p, q, distance_type=np.inf)) # 3
# 计算闵可夫斯基距离
print(distance(p, q, distance_type=3)) # 3.4641016151377544
本文介绍了常见的多维距离度量方法:欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离。这些距离度量方法在机器学习、数据挖掘等领域有很广泛的应用。
同时,本文也给出了Python中计算两个多维点之间距离的代码实现,希望对读者在实际应用中有所帮助。