各种距离(I)闵可夫斯基距离和它的朋友们

本文详细介绍了几种常见的向量间距离度量方法,包括闵可夫斯基距离、曼哈顿距离、欧式距离及切比雪夫距离等,并给出了各自的数学表达式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提

假设有向量x=x1x2xn和向量y=y1y1yn

向量的模

|x|=i=1nx2i

|y|=i=1ny2i

闵可夫斯基距离

dist(x,y)=(i=1n|xiyi|p)1p

p=1

曼哈顿距离

dist(x,y)=i=1n|xiyi|

p=2

欧式距离

向量表示法

dist(x,y)=|xy|

一般表示法

dist(x,y)=i=1n(xiyi)2

p+

切比雪夫距离

dist(x,y)=maxi|xiyi|
<think>好的,我现在需要回答用户关于如何在Python中实现闵可夫斯基距离的问题,并提供代码示例。首先,我得回忆一下闵可夫斯基距离的定义。闵可夫斯基距离是欧几里得距离曼哈顿距离的泛化形式,公式是:$$D(x, y) = \left( \sum_{i=1}^n |x_i - y_i|^p \right)^{1/p}$$,其中p是参数。当p=1时是曼哈顿距离,p=2时是欧几里得距离。 用户需要代码示例,我应该先写一个函数,接受两个向量参数p,然后计算它们的闵可夫斯基距离。需要注意处理不同长度的向量,可能需要异常处理。另外,用户提供的引用中有提到mimic_minkowski的函数,这可能是指如何模拟闵可夫斯基距离的实现,不过用户的问题更偏向于直接实现。 接下来,我应该检查引用的内容是否有帮助。引用[1][2]提到了使用闵可夫斯基距离的计算,特别是引用[2]中的代码循环遍历数据点,计算每个点与测试点的距离,并存储到数据框中。这可能提示在实现距离函数后,如何应用到实际数据中,比如pandas的数据处理。 然后,我需要考虑代码的正确性。比如,计算绝对值的p次方之,再开p次根。可以用NumPy来处理数组,这样更高效。同时,当p为无穷大时,闵可夫斯基距离实际上是切比雪夫距离,即最大值,但用户的问题可能暂时不需要处理这种情况,不过最好在函数中添加对p的判断,或者给出说明。 另外,用户提供的引用中有错误处理的例子,比如引用[4]检查NaN值,可能在计算距离时也需要考虑输入的有效性,比如是否包含非数值元素,但为了简化示例,可能暂时忽略这部分,除非用户特别要求。 现在,开始编写函数。首先导入必要的库,比如numpy。函数定义部分,参数是两个向量p,假设向量是列表或NumPy数组。计算每个维度上的差的绝对值的p次方,求,然后取1/p次方。注意当p为0的情况可能需要处理,但通常p≥1。 例如,函数可能如下: def minkowski_distance(a, b, p): return np.sum(np.abs(np.array(a) - np.array(b))**p)**(1/p) 测试这个函数是否正确。比如,当p=1时,应该是曼哈顿距离,p=2时是欧几里得距离。用示例数据验证,比如test_pt = [4.8, 2.7, 2.5, 0.7]X中的数据点,如引用[2]中的例子,可能需要具体的数据。但用户可能没有提供具体数据,所以用简单的例子代替。 然后,展示如何在循环中使用该函数计算所有点与测试点的距离,并存储到DataFrame中,如引用[2]中的代码片段。这样用户可以看到如何应用到实际数据处理中。 可能还需要提到SciPy库中已有的实现,比如scipy.spatial.distance.minkowski,但用户可能需要自己实现的例子,所以重点放在自定义函数上。 最后,根据引用中的信息,确保代码示例与用户提供的引用内容相符,比如引用[2]中的循环结构,可能在示例中包含类似的循环应用到pandas DataFrame的步骤。 总结步骤: 1. 定义闵可夫斯基距离函数,处理不同的p值。 2. 提供示例数据,计算并验证结果。 3. 展示如何在实际数据集中应用该函数,结合pandas。 4. 提到SciPy中的现有实现,供用户参考。</think>以下是Python实现闵可夫斯基距离的代码示例及分步说明: ### 1. 闵可夫斯基距离公式 闵可夫斯基距离是欧氏距离曼哈顿距离的泛化形式,数学表达式为: $$D(x, y) = \left( \sum_{i=1}^n |x_i - y_i|^p \right)^{1/p}$$ 其中$p=1$时为曼哈顿距离,$p=2$时为欧氏距离[^1] ### 2. Python代码实现 ```python import numpy as np def minkowski_distance(a, b, p=2): """ 计算两个向量间的闵可夫斯基距离 参数: a, b -- 输入向量(列表/数组) p -- 距离参数(默认为2,即欧氏距离) """ a = np.array(a) b = np.array(b) assert len(a) == len(b), "向量维度必须相同" return np.sum(np.abs(a - b)**p) ** (1/p) ``` ### 3. 使用示例 ```python # 测试点 test_point = [4.8, 2.7, 2.5, 0.7] # 数据集中的样本点 data_point = [5.1, 3.8, 1.9, 0.4] # 计算欧氏距离(p=2) print(minkowski_distance(test_point, data_point, 2)) # 输出:1.456 # 计算曼哈顿距离(p=1) print(minkowski_distance(test_point, data_point, 1)) # 输出:2.5 ``` ### 4. 实际应用场景(基于引用[2]) ```python import pandas as pd # 假设X是包含特征的数据框 X = pd.DataFrame([[5.1, 3.5, 1.4, 0.2], [4.9, 3.0, 1.4, 0.2], [4.7, 3.2, 1.3, 0.2]]) # 计算所有数据点到测试点的距离 distances = [] for i in X.index: distances.append(minkowski_distance(test_point, X.iloc[i], p=3)) df_dists = pd.DataFrame(distances, index=X.index, columns=['distance']) print(df_dists.head()) ``` ### 5. 注意事項 - 使用NumPy数组可以提高计算效率 - 当$p \to \infty$时为切比雪夫距离 - Scipy已内置实现:`from scipy.spatial import minkowski`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值