Python七種距離度量方法全解析
前言
本文介紹了歐氏距離、曼哈頓距離、切比雪夫距離、余弦距離、閔可夫斯基距離、漢明距離、編輯距離等七種常用距離度量方法的原理、意義與應(yīng)用場(chǎng)景,并提供了 Python 代碼實(shí)現(xiàn),幫助在數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)與工程實(shí)踐中選擇和使用合適的距離度量方法。
一、 歐式距離
歐氏距離是“直線距離”。在二維或三維空間中,它就是兩個(gè)點(diǎn)之間直接用尺子量出來(lái)的最短距離。

1. 核心思想
它源于歐幾里得的幾何學(xué),衡量的是空間中兩個(gè)點(diǎn)之間的“真實(shí)”直線長(zhǎng)度。
2. 計(jì)算方法
- 二維空間(平面):計(jì)算兩個(gè)點(diǎn)橫坐標(biāo)差的平方加上縱坐標(biāo)差的平方,然后取平方根。
- 三維空間:計(jì)算兩個(gè)點(diǎn)橫坐標(biāo)差的平方加上縱坐標(biāo)差的平方再加上豎坐標(biāo)差的平方,然后取平方根。
- N維空間(通用):計(jì)算兩個(gè)點(diǎn)在各維度上數(shù)值差的平方之和,然后取平方根。
3. 示例代碼
from math import sqrt
def euclidean_distance(p, q):
"""
計(jì)算歐式距離
p, q: 相同維度的數(shù)組或列表
"""
return sqrt(sum((px - qx) ** 2 for px, qx in zip(p, q)))
p = [1, 2, 3]
q = [4, 5, 6]
print(f"歐式距離: {euclidean_distance(p, q)}")
4. 主要特點(diǎn)
- 幾何直觀強(qiáng):是最自然的距離度量方式,符合日??臻g感知。
- 各向同性:在各個(gè)方向上具有相同的權(quán)重,適用于度量“真實(shí)”空間距離。
- 對(duì)異常值敏感:由于平方項(xiàng)的存在,個(gè)別維度的大差異會(huì)被放大。
- 計(jì)算復(fù)雜度中等:涉及平方、求和與開(kāi)方運(yùn)算。
5. 常見(jiàn)應(yīng)用場(chǎng)景
- 空間幾何:如計(jì)算兩點(diǎn)之間的實(shí)際距離。
- 機(jī)器學(xué)習(xí):KNN、K-means等算法中常用的距離度量。
- 圖像處理:如像素之間的顏色距離計(jì)算。
- 數(shù)據(jù)聚類與分類:在特征空間中度量樣本相似性。
二、 曼哈頓距離
曼哈頓距離,也稱為“城市街區(qū)距離”或“L1距離”,是指兩點(diǎn)在標(biāo)準(zhǔn)坐標(biāo)系上的絕對(duì)軸距總和。

1. 核心思想
來(lái)源于在網(wǎng)格狀道路(如曼哈頓街區(qū))中行走的最短路徑,只能沿著水平和垂直方向移動(dòng),不能走斜線。
2. 計(jì)算方法
計(jì)算兩個(gè)點(diǎn)在各維度上數(shù)值差的絕對(duì)值之和。
3. 示例代碼
def manhattan_distance(p, q):
"""
計(jì)算曼哈頓距離
"""
return sum(abs(px - qx) for px, qx in zip(p, q))
# 示例
p = [1, 2, 3]
q = [4, 5, 6]
print(f"曼哈頓距離: {manhattan_distance(p, q)}")
4. 主要特點(diǎn)
- 非直線路徑:適用于只能沿坐標(biāo)軸方向移動(dòng)的場(chǎng)景。
- 對(duì)異常值不敏感:相比歐氏距離,對(duì)個(gè)別維度的極端值不那么敏感。
- 計(jì)算簡(jiǎn)單高效:僅涉及絕對(duì)值和加法運(yùn)算。
5. 常見(jiàn)應(yīng)用場(chǎng)景
- 路徑規(guī)劃:如城市網(wǎng)格導(dǎo)航、機(jī)器人移動(dòng)規(guī)劃。
- 數(shù)據(jù)挖掘:在某些聚類或分類任務(wù)中,尤其是當(dāng)特征空間具有明顯網(wǎng)格結(jié)構(gòu)時(shí)。
- 圖像處理:如像素距離計(jì)算、圖像壓縮等。
三、 切比雪夫距離
切比雪夫距離,也稱為“棋盤(pán)距離”,是指兩點(diǎn)之間各坐標(biāo)數(shù)值差的最大值。

1. 核心思想
來(lái)源于國(guó)際象棋中“王”的移動(dòng)方式,可以朝任意方向移動(dòng)一格,因此在多維空間中體現(xiàn)為各維度差值中的最大值。
2. 計(jì)算方法
取兩個(gè)點(diǎn)在各維度上數(shù)值差的絕對(duì)值中的最大值。
3. 示例代碼
def chebyshev_distance(p, q):
"""
計(jì)算切比雪夫距離
"""
return max(abs(px - qx) for px, qx in zip(p, q))
# 示例
p = [1, 2, 3]
q = [4, 5, 6]
print(f"切比雪夫距離: {chebyshev_distance(p, q)}")
4. 主要特點(diǎn)
- 關(guān)注最大差異:僅由最大差異的維度決定距離。
- 適用于方形鄰域:在多維空間中定義“超立方體”鄰域。
- 計(jì)算簡(jiǎn)單:僅需比較和取最大值。
5. 常見(jiàn)應(yīng)用場(chǎng)景
- 棋盤(pán)類游戲AI:如國(guó)際象棋、圍棋的移動(dòng)判斷。
- 工業(yè)制造:在質(zhì)量控制中檢測(cè)最大偏差。
- 圖像處理:用于邊緣檢測(cè)、形態(tài)學(xué)操作中的鄰域定義。
四、余弦距離

1. 核心思想
余弦距離用于衡量?jī)蓚€(gè)向量在方向上的差異,而不是位置或絕對(duì)長(zhǎng)度。它基于向量夾角的余弦值,適用于高維稀疏向量比較,如文本相似性分析。
2. 計(jì)算方法
- 計(jì)算兩個(gè)向量的點(diǎn)積(對(duì)應(yīng)元素相乘后求和)
- 分別計(jì)算兩個(gè)向量的模長(zhǎng)(各元素平方和的平方根)
- 用點(diǎn)積除以兩個(gè)模長(zhǎng)的乘積,得到余弦相似度
- 余弦距離 = 1 - 余弦相似度
3. 示例代碼
import numpy as np
from numpy.linalg import norm
def cosine_distance(a, b):
"""
計(jì)算余弦距離 = 1 - 余弦相似度
注:對(duì)于零向量,余弦相似度通常定義為0,因此余弦距離為1
"""
dot_product = np.dot(a, b)
norm_a = norm(a)
norm_b = norm(b)
if norm_a == 0 or norm_b == 0:
return 1.0 # 零向量的情況
cosine_sim = dot_product / (norm_a * norm_b)
return 1.0 - cosine_sim
# 示例
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(f"余弦距離: {cosine_distance(a, b)}")
4. 主要特點(diǎn)
- 方向敏感性:只關(guān)注向量方向,忽略長(zhǎng)度差異
- 適合高維稀疏數(shù)據(jù):對(duì)文本TF-IDF向量等效果顯著
- 歸一化特性:結(jié)果在[0,2]或[0,1]之間
- 計(jì)算復(fù)雜度:中等,涉及點(diǎn)積和范數(shù)計(jì)算
5. 常見(jiàn)應(yīng)用場(chǎng)景
- 文本相似度計(jì)算(信息檢索、推薦系統(tǒng))
- 文檔聚類與分類
- 協(xié)同過(guò)濾推薦
- 高維數(shù)據(jù)相似性搜索
五、閔可夫斯基距離
1. 核心思想
閔可夫斯基距離是歐式距離和曼哈頓距離的一般化形式,通過(guò)參數(shù) ( p ) 控制距離的計(jì)算方式。
2. 計(jì)算方法
- 計(jì)算兩個(gè)點(diǎn)在各維度上數(shù)值差的絕對(duì)值的 p 次方
- 將這些 p 次方的值求和
- 對(duì)求和結(jié)果取 p 次方根
3. 特殊情況
- p = 1:曼哈頓距離
- p = 2:歐氏距離
- p → ∞:切比雪夫距離
4. 示例代碼
from math import pow
def minkowski_distance(point1, point2, order=2):
"""
計(jì)算閔可夫斯基距離
參數(shù):
point1, point2: 要比較的點(diǎn)(列表或數(shù)組)
order: 閔可夫斯基參數(shù)(order=1:曼哈頓,order=2:歐式,order=∞:切比雪夫)
"""
if order == float('inf'):
# 切比雪夫距離
return max(abs(p1 - p2) for p1, p2 in zip(point1, point2))
sum_power = sum(pow(abs(p1 - p2), order) for p1, p2 in zip(point1, point2))
return pow(sum_power, 1.0 / order)
# 示例
p = [1, 2, 3]
q = [4, 5, 6]
print(f"閔可夫斯基距離(order=1, 曼哈頓): {minkowski_distance(p, q, order=1)}")
print(f"閔可夫斯基距離(order=2, 歐式): {minkowski_distance(p, q, order=2)}")
print(f"閔可夫斯基距離(order=3): {minkowski_distance(p, q, order=3)}")
print(f"閔可夫斯基距離(order=∞, 切比雪夫): {minkowski_distance(p, q, order=float('inf'))}")
5. 主要特點(diǎn)
- 通用性強(qiáng):通過(guò)參數(shù)調(diào)節(jié)適應(yīng)不同場(chǎng)景
- 連續(xù)變化:距離特性隨 p 值連續(xù)變化
- 對(duì)異常值的敏感性:當(dāng) p 值較大時(shí),對(duì)異常值更敏感;p 值較小時(shí),對(duì)異常值較不敏感。
- 計(jì)算復(fù)雜度:隨 p 變化,一般高于曼哈頓距離
6. 常見(jiàn)應(yīng)用場(chǎng)景
- 機(jī)器學(xué)習(xí)中的距離度量選擇
- 模式識(shí)別與分類
- 參數(shù)化距離分析
- 多準(zhǔn)則決策分析
六、漢明距離

1. 核心思想
漢明距離用于比較兩個(gè)等長(zhǎng)字符串或序列的不同位置數(shù)量,主要用于編碼理論和信息論。
2. 計(jì)算方法
比較兩個(gè)字符串或序列對(duì)應(yīng)位置上的字符或數(shù)值,統(tǒng)計(jì)不相等的位數(shù)的總數(shù)。
3. 示例代碼
def hamming_distance(s1, s2):
"""
計(jì)算漢明距離(適用于等長(zhǎng)序列)
"""
if len(s1) != len(s2):
raise ValueError("序列長(zhǎng)度必須相等")
return sum(c1 != c2 for c1, c2 in zip(s1, s2))
# 示例(字符串)
s1 = "karolin"
s2 = "kathrin"
print(f"字符串漢明距離: {hamming_distance(s1, s2)}")
# 示例(二進(jìn)制列表)
binary1 = [1, 0, 1, 0, 1]
binary2 = [0, 1, 0, 1, 0]
print(f"二進(jìn)制漢明距離: {hamming_distance(binary1, binary2)}")
4. 主要特點(diǎn)
- 離散性:只比較對(duì)應(yīng)位置是否相等
- 簡(jiǎn)單高效:適用于二進(jìn)制或離散數(shù)據(jù)
- 無(wú)方向性:僅計(jì)數(shù)差異,不衡量差異大小
5. 常見(jiàn)應(yīng)用場(chǎng)景
- 錯(cuò)誤檢測(cè)與糾正編碼
- 基因組序列比對(duì)
- 網(wǎng)絡(luò)數(shù)據(jù)包校驗(yàn)
- 二進(jìn)制特征比較
七、編輯距離

1. 核心思想
編輯距離衡量?jī)蓚€(gè)字符串之間的相似度,定義為將一個(gè)字符串轉(zhuǎn)換為另一個(gè)字符串所需的最少編輯操作次數(shù)(插入、刪除、替換)。
2. 計(jì)算方法
使用動(dòng)態(tài)規(guī)劃算法:
- 創(chuàng)建一個(gè)二維表格,行數(shù)=源字符串長(zhǎng)度+1,列數(shù)=目標(biāo)字符串長(zhǎng)度+1
- 初始化第一行和第一列(從空字符串轉(zhuǎn)換的代價(jià))
- 逐行逐列填充表格:
- 如果字符相同,直接取左上角值(表示無(wú)需編輯)。
- 如果字符不同,取左方(刪除)、上方(插入)、左上方(替換)三個(gè)值的最小值加1。
- 表格右下角的值即為編輯距離
3. 示例代碼
def edit_distance(s1, s2):
"""
計(jì)算編輯距離(Levenshtein距離)
"""
m, n = len(s1), len(s2)
dp = [[0] * (n + 1) for _ in range(m + 1)]
# 初始化邊界條件
for i in range(m + 1):
dp[i][0] = i
for j in range(n + 1):
dp[0][j] = j
# 動(dòng)態(tài)規(guī)劃填表
for i in range(1, m + 1):
for j in range(1, n + 1):
if s1[i-1] == s2[j-1]:
dp[i][j] = dp[i-1][j-1] # 字符相同,無(wú)需編輯
else:
dp[i][j] = min(
dp[i-1][j] + 1, # 刪除
dp[i][j-1] + 1, # 插入
dp[i-1][j-1] + 1 # 替換
)
return dp[m][n]
def normalized_edit_distance(s1, s2):
"""
計(jì)算歸一化編輯距離(范圍[0, 1])
"""
max_len = max(len(s1), len(s2))
if max_len == 0:
return 0.0
return edit_distance(s1, s2) / max_len
# 示例
s1 = "kitten"
s2 = "sitting"
print(f"編輯距離: {edit_distance(s1, s2)}") # 輸出: 3
print(f"歸一化編輯距離: {normalized_edit_distance(s1, s2):.4f}") # 輸出: 0.4286
4. 主要特點(diǎn)
- 靈活性強(qiáng):支持不等長(zhǎng)字符串
- 操作敏感:區(qū)分插入、刪除、替換
- 計(jì)算復(fù)雜度:O(m×n),可優(yōu)化
- 歸一化版本:編輯距離歸一化到 [0,1] 區(qū)間
5. 常見(jiàn)應(yīng)用場(chǎng)景
- 拼寫(xiě)檢查與糾錯(cuò)
- 生物序列比對(duì)(DNA/蛋白質(zhì))
- 自然語(yǔ)言處理(文本相似度)
- 模糊字符串匹配(數(shù)據(jù)清洗)
- 語(yǔ)音識(shí)別與語(yǔ)音轉(zhuǎn)換
八、 比較
| 核心思想 | 計(jì)算復(fù)雜度 | 異常值敏感性 | 適用數(shù)據(jù)類型 | 應(yīng)用場(chǎng)景 | 別名/類別 | |
|---|---|---|---|---|---|---|
| 歐式距離 | 兩點(diǎn)之間的“直線距離” | 中等(平方、求和、開(kāi)方) | 敏感(平方放大異常值) | 各向同性空間 | 幾何距離、KNN、聚類、圖像處理 | L2距離、直線距離 |
| 曼哈頓距離 | 兩點(diǎn)在網(wǎng)格路徑上的“城市街區(qū)距離” | 低(絕對(duì)值、求和) | 較不敏感 | 網(wǎng)格/正交空間 | 路徑規(guī)劃、網(wǎng)格導(dǎo)航、圖像處理、數(shù)據(jù)挖掘 | L1距離、城市街區(qū)距離 |
| 切比雪夫距離 | 兩點(diǎn)在各維度上差異的最大值 | 低(比較、取最大值) | 依賴最大差異維度 | 最大差異主導(dǎo)空間 | 棋盤(pán)AI、質(zhì)量控制、圖像形態(tài)學(xué) | 棋盤(pán)距離、L∞距離 |
| 余弦距離 | 向量方向相似性 | 中等 | 不敏感 | 高維稀疏向量 | 文本挖掘、推薦系統(tǒng)、文檔聚類 | 余弦相似度的補(bǔ) |
| 閔可夫斯基距離 | 參數(shù)化的通用距離族 | 中等(取決于p) | 敏感(p≠∞時(shí)) | 連續(xù)數(shù)值數(shù)據(jù) | 參數(shù)化距離分析、機(jī)器學(xué)習(xí) | Minkowski距離族 |
| 漢明距離 | 離散序列差異計(jì)數(shù) | 低 | 對(duì)位置差異敏感 | 等長(zhǎng)序列 | 編碼理論、基因組比對(duì)、錯(cuò)誤檢測(cè) | 漢明差異 |
| 編輯距離 | 字符串轉(zhuǎn)換的最少編輯操作數(shù) | 中等(O(m×n),動(dòng)態(tài)規(guī)劃) | 對(duì)編輯位置敏感,對(duì)數(shù)值不敏感 | 字符串/序列(可不等長(zhǎng)) | 拼寫(xiě)糾錯(cuò)、生物序列比對(duì)、文本相似度、模糊匹配 | Levenshtein距離、字符串編輯距離 |
九、選擇
- 歐式距離:最自然的空間距離,適用于物理空間或各向同性特征空間
- 曼哈頓距離:適用于網(wǎng)格路徑、特征獨(dú)立的場(chǎng)景
- 切比雪夫距離:關(guān)注最大差異的場(chǎng)景,如質(zhì)量控制
- 余弦距離:適合文本、高維稀疏數(shù)據(jù)的方向比較
- 閔可夫斯基距離:需要靈活調(diào)整距離特性的參數(shù)化方法
- 漢明距離:離散序列、編碼、二進(jìn)制數(shù)據(jù)的比較
- 編輯距離:字符串處理、文本相似度、生物信息學(xué)
不同的距離度量適用于不同的數(shù)據(jù)特性和任務(wù)需求。在實(shí)際應(yīng)用中,通常需要根據(jù)數(shù)據(jù)分布、特征關(guān)系和具體任務(wù)來(lái)選擇合適的距離函數(shù)。
到此這篇關(guān)于Python七種距離度量方法的文章就介紹到這了,更多相關(guān)Python距離度量方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python對(duì)列表中的各項(xiàng)進(jìn)行關(guān)聯(lián)詳解
這篇文章主要給大家介紹了關(guān)于Python對(duì)列表中各項(xiàng)進(jìn)行關(guān)聯(lián)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08
python Tkinter的簡(jiǎn)單入門(mén)教程
這篇文章主要介紹了python Tkinter的簡(jiǎn)單入門(mén)教程,幫助大家更好的理解和學(xué)習(xí)使用python制作gui程序,感興趣的朋友可以了解下2021-04-04
python中字符串?dāng)?shù)組逆序排列方法總結(jié)
在本篇文章里小編給大家整理了關(guān)于python中字符串?dāng)?shù)組如何逆序排列的相關(guān)知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)下。2019-06-06
python字典中items()函數(shù)用法實(shí)例
Python字典items()函數(shù)作用以列表返回可遍歷的(鍵, 值)元組數(shù)組,下面這篇文章主要給大家介紹了關(guān)于python字典中items()函數(shù)用法的相關(guān)資料,需要的朋友可以參考下2022-11-11
在windows系統(tǒng)中實(shí)現(xiàn)python3安裝lxml
本文主要給大家簡(jiǎn)單介紹了下在windows以及l(fā)inux系統(tǒng)中使用Python安裝LXML模塊的教程,非常簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下2016-03-03
Python求平面內(nèi)點(diǎn)到直線距離的實(shí)現(xiàn)
今天小編就為大家分享一篇Python求平面內(nèi)點(diǎn)到直線距離的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01

