python 各类距离公式实现

本文详细介绍了Python中实现的多种距离计算公式,包括闵可夫斯基距离、欧氏距离、曼哈顿距离、切比雪夫距离、夹角余弦、汉明距离、杰卡德相似系数、编辑距离、标准化欧氏距离、马氏距离、皮尔逊相关系数和布雷柯蒂斯距离。每种距离的定义、优缺点和Python代码示例均有详细阐述,适用于数据处理和机器学习中衡量样本相似度的场景。

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

所列的距离公式列表和代码如下:

  • 闵可夫斯基距离(Minkowski Distance)
  • 欧氏距离(Euclidean Distance)
  • 曼哈顿距离(Manhattan Distance)
  • 切比雪夫距离(Chebyshev Distance)
  • 夹角余弦(Cosine)
  • 汉明距离(Hamming distance)
  • 杰卡德相似系数(Jaccard similarity coefficient)
  • 编辑距离(Edit Distance)
  • 标准化欧氏距离 (Standardized Euclidean distance )
  • 马氏距离(Mahalanobis Distance)
  • 皮尔逊相关系数(Pearson correlation)
  • 布雷柯蒂斯距离(Bray Curtis Distance)

读者可根据自己需求有选择的学习。因使用矢量编程的方法,距离计算得到了较大的简化。

1. 闵可夫斯基距离(Minkowski Distance)

严格意义上,闵氏距离不是一种距离,而是一组距离的定义。

(1)闵氏距离的定义:

两个n维变量A(x11,x12,…,x1n)与 B(x21,x22,…,x2n)间的闵可夫斯基距离定义为:

其中p是一个变参数。

当p=1时,就是曼哈顿距离

当p=2时,就是欧氏距离

当p→∞时,就是切比雪夫距离

根据变参数的不同,闵氏距离可以表示一类的距离。

(2)闵氏距离的缺点

闵氏距离,包括曼哈顿距离、欧氏距离和切比雪夫距离都存在明显的缺点。

举个例子:二维样本(身高,体重),其中身高范围是150\~190,体重范围是50~60,有三个样本:a(180,50),b(190,50),c(180,60)。那么a与b之间的闵氏距离(无论是曼哈顿距离、欧氏距离或切比雪夫距离)等于a与c之间的闵氏距离,但是身高的10cm真的等价于体重的10kg么?因此用闵氏距离来衡量这些样本间的相似度很有问题。

简单说来,闵氏距离的缺点主要有两个: (1)将各个分量的量纲(scale),也就是“单位”当作相同的看待了。 (2)没有考虑各个分量的分布(期望,方差等)可能是不同的。

python中的实现:

# -*- coding:utf-8 -*-
import numpy as np
x=np.random.random(10)
y=np.random.random(10)

#方法一:根据公式求解,p=2
d1=np.sqrt(np.sum(np.square(x-y)))
print('d1:',d1)

#方法二:根据scipy库求解
from scipy.spatial.distance import pdist
X=np.vstack([x,y])
d2=pdist(X,'minkowski',p=2)[0]
print('d2:',d2)

2.欧氏距离(Euclidean Distance)

欧氏距离(L2范数)是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式(如图1.9)。

(4) python实现欧式距离公式的:

# -*- coding: utf-8 -*-
from numpy import *

vector1 = mat([1,2,3])
vector2 = mat([4,5,6])
print (sqrt((vector1-vector2)*((vector1-vector2).T)))


import numpy as np

x = np.random.random(10)
y = np.random.random(10)
# solution1
dist1 = np.linalg.norm(x - y)
# solution2
dist2 = np.sqrt(np.sum(np.square(x - y)))
print('x', x)
print('y', y)
print('dist1:', dist1)
print('dist2:', dist2)

# solution3
from scipy.spatial.distance import pdist

X=np.vstack([x,y])
d2=pdist(X)[0]
print('d2:',d2)

3.曼哈顿距离(Manhattan Distance)

从名字就可以猜出这种距离的计算方法了。想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个“曼哈顿距离”(L1范数)。而这也是曼哈顿距离名称的来源,曼哈顿距离也称为城市街区距离(City Block distance)(如图1.10)。

(3)python实现曼哈顿距离:

# -*- coding: utf-8 -*-
from numpy import *

vector1 = mat([1,2,3])
vector2 = mat([4,5,6])
print (sum(abs(vector1-vector2)))

import numpy as np

x=np.random.random(10)
y=np.random.random(10)
#方法一:根据公式求解
d1=np.sum(np.abs(x-y))
print('d1:',d1)

#方法二:根据scipy库求解
from scipy.spatial.distance import pdist

X=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值