python求各种距离公式

本文介绍了使用Python的scipy.spatial.distance模块计算不同距离的方法,包括欧式距离、曼哈顿距离、余弦距离等,并提供了相应的代码示例。通过这些函数,可以方便地计算样本之间的各种距离。

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

今天一个偶然的机会体会到了python数据运算的强大。求一个数组各样本之间的距离仅简单的几句代码就行。看来真的技术改变世界啊。废话不多说,记下来怕以后忘记。
from scipy.spatial.distance import pdist, squareform
下面结合API文档标注一下具体用法:
 
1.X = pdist(X, 'euclidean')
计算数组X样本之间的欧式距离 返回值为 Y 为压缩距离元组或矩阵(以下等同)
 
2. X = pdist(X, 'minkowski', p)
计算数组样本之间的明氏距离
3. Y = pdist(X, 'cityblock')
计算数组样本之间的曼哈顿距离
4. X = pdist(X, 'seuclidean', V=None)
计算数组样本之间的标准化欧式距离 ,v是方差向量,表示 v[i]表示第i个分量的方差,如果缺失。默认自动计算。
5. X = pdist(X, 'sqeuclidean')
计算数组样本之间欧式距离的平方
 
6.
<think>嗯,用户想了解如何用Python描述闵可夫斯基距离公式。首先,我需要回忆一下闵可夫斯基距离的定义。它是欧氏距离和曼哈顿距离的一般化形式,对吧?公式应该是这样的:对于两个向量p和q,距离是各个维度差的绝对值的p次方和,再开p次方根。参数p的不同值对应不同的距离,比如p=1是曼哈顿,p=2是欧氏,p无穷大时是切比雪夫距离。 接下来,用户可能希望看到具体的Python实现。我需要先导入numpy库,因为处理向量运算比较方便。然后定义一个函数,参数包括两个向量和p的值。在函数内部,首先检查两个向量长度是否相同,否则会报错。然后计算每个维度差的绝对值,再取p次方,和,最后开p次方根返回结果。需要注意的是,当p为无穷大时,处理方式不同,这时候应该取最大值而不是和。所以可能需要处理p的特殊情况,但通常闵可夫斯基函数的实现可能不包含无穷大的情况,或者需要单独处理。不过用户可能只需要基础版本,暂时先实现常规情况,后面再补充例子说明不同p值的效果。 然后,测试几个例子。比如p=1时,曼哈顿距离是否正确,p=2时欧氏距离是否计算正确。可能还需要处理p的值是否合理,比如必须大于等于1,不过错误处理可能用户暂时不需要,但可以提及。最后,代码要清晰,给出示例输出,这样用户能直接看到效果。可能还需要提醒用户安装numpy库,如果他们没有的话。 总结步骤:导入numpy,定义函数,参数检查,计算每个差的绝对值,p次方,和,开根号。给出不同p值的例子,并解释结果。确保代码正确,语法无误,使用中文注释或说明。</think>好的,我们将分步骤用Python实现闵可夫斯基距离公式,并通过示例说明其应用。 --- ### **1. 闵可夫斯基距离公式** 对于两个n维向量 $\mathbf{p} = (p_1, p_2, \dots, p_n)$ 和 $\mathbf{q} = (q_1, q_2, \dots, q_n)$,其闵可夫斯基距离公式为: $$ D(\mathbf{p}, \mathbf{q}) = \left( \sum_{i=1}^{n} |p_i - q_i|^k \right)^{1/k} $$ 其中 $k$ 是距离参数: - $k=1$:曼哈顿距离(Manhattan) - $k=2$:欧氏距离(Euclidean) - $k \to \infty$:切比雪夫距离(Chebyshev) --- ### **2. Python实现** ```python import numpy as np def minkowski_distance(p, q, k): """ 计算两个向量的闵可夫斯基距离 参数: p (array-like): 第一个向量 q (array-like): 第二个向量 k (int/float): 距离参数 返回: float: 闵可夫斯基距离 """ # 转换为numpy数组 p = np.array(p) q = np.array(q) # 检查维度一致性 if p.shape != q.shape: raise ValueError("向量维度不一致") # 计算绝对差值的k次方之和 sum_powered_diff = np.sum(np.abs(p - q) ** k) # 取k次方根 distance = sum_powered_diff ** (1.0 / k) return distance ``` --- ### **3. 示例测试** #### **示例1:曼哈顿距离(k=1)** ```python p = [1, 2, 3] q = [4, 5, 6] print(minkowski_distance(p, q, 1)) # 输出:|1-4| + |2-5| + |3-6| = 9 ``` #### **示例2:欧氏距离(k=2)** ```python p = [0, 0] q = [3, 4] print(minkowski_distance(p, q, 2)) # 输出:√(3² + 4²) = 5.0 ``` #### **示例3:自定义参数(k=3)** ```python p = [1, 1] q = [2, 3] print(minkowski_distance(p, q, 3)) # 输出:(|1-2|³ + |1-3|³)^(1/3) ≈ 2.08 ``` --- ### **4. 关键点说明** 1. **参数k的作用**:通过调整k的值,可以控制距离计算中对差异的敏感度。 2. **数值稳定性**:当k非常大时,计算可能溢出,建议对输入数据做归一化。 3. **与scipy的关系**:实际项目中可直接使用`scipy.spatial.distance.minkowski`,但理解原理有助于定制化需。 如果需要进一步优化或处理特殊情况(如k→∞),请告诉我!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值