【ShuQiHere】
在机器学习和数据挖掘领域,K 最近邻算法(K-Nearest Neighbors,简称 KNN)是一种简单 yet 强大的非参数监督学习方法。KNN 的核心在于度量样本之间的距离,从而确定样本的相似性。距离度量的选择直接影响 KNN 的性能和准确性。在本文中,我们将深入探讨两种常用的距离度量方法:欧几里得距离(Euclidean Distance)和曼哈顿距离(Manhattan Distance),并探讨它们在 KNN 算法中的应用与区别。💡
一、K 最近邻算法概述 📚
1.1 什么是 KNN?
KNN 是一种基于实例的学习算法,主要用于分类和回归任务。其核心思想是:给定一个待预测样本,寻找训练集中与其最接近的 K 个邻居,根据这些邻居的信息来进行预测。
- 分类任务:通过投票方式,选择出现频率最高的类别作为预测结果。
- 回归任务:取 K 个邻居目标值的平均值作为预测结果。
1.2 距离度量在 KNN 中的重要性
在 KNN 中,距离度量是关键因素。它决定了哪些邻居是“最近”的,从而影响预测结果的准确性。不同的距离度量方法会导致不同的邻居选择,因此选择合适的距离度量对于 KNN 的性能至关重要。
二、欧几里得距离(Euclidean Distance)📏
2.1 定义
欧几里得距离是最常用的距离度量方法,表示两个点之间的直线距离。在二维空间中,它就是平面上两点之间的最短路径。
2.2 公式
对于两个 n 维向量或点 p p p 和 q q q,欧几里得距离定义为:
d Euclidean ( p , q ) = ∑ i = 1 n ( p i − q i ) 2 d_{\text{Euclidean}}(p, q) = \sqrt{\sum_{i=1}^{n} (p_i - q_i)^2} dEuclidean(p,q)=i=1∑n(pi−qi)2
- p i p_i pi 和 q i q_i qi:点 p p p 和 q q q 在第 i i i 个维度的坐标。
2.3 特点
- 直观性:反映实际空间中的距离,易于理解。
- 敏感性:对离群值和尺度变化敏感,需要进行数据标准化。
- 应用广泛:适用于连续型变量,常用于低维空间。
2.4 在 KNN 中的应用
在 KNN 中,欧几里得距离用于计算待预测样本与训练集中每个样本的距离。举例来说,假设有一个待分类样本 x x x,我们需要计算 x x x 与训练集中所有样本的欧几里得距离,选取距离最小的 K 个样本作为邻居。
实际例子
假设有以下数据点:
- 训练集样本: A ( 1 , 2 ) A(1, 2) A(1,2), B ( 4 , 6 ) B(4, 6) B(4,6), C ( 5 , 2 ) C(5, 2) C(5,2)
- 待分类样本: X ( 3 , 4 ) X(3, 4) X(3,4)
计算 X X X 与每个训练样本的欧几里得距离:
- d ( X , A ) = ( 3 − 1 ) 2 + ( 4 − 2 ) 2 = 4 + 4 = 8 ≈ 2.83 d(X, A) = \sqrt{(3 - 1)^2 + (4 - 2)^2} = \sqrt{4 + 4} = \sqrt{8} \approx 2.83 d(X,A)=(3−1)2+(4−2)2=4+4=8≈2.83
- d ( X , B ) = ( 3 − 4 ) 2 + ( 4 − 6 ) 2 = 1 + 4 = 5 ≈ 2.24 d(X, B) = \sqrt{(3 - 4)^2 + (4 - 6)^2} = \sqrt{1 + 4} = \sqrt{5} \approx 2.24 d(X,B)=(3−4)2+(4−6)2=1+4=5≈2.24
- d ( X , C ) = ( 3 − 5 ) 2 + ( 4 − 2 ) 2 = 4 + 4 = 8 ≈ 2.83 d(X, C) = \sqrt{(3 - 5)^2 + (4 - 2)^2} = \sqrt{4 + 4} = \sqrt{8} \approx 2.83 d(X,C)=(3−5)2+(4−2)2=4+4=8≈2.83
根据距离, B B B 是距离 X X X 最近的邻居。
2.5 代码实现
import numpy as np
from collections import Counterdef euclidean_distance(a, b):return np.sqrt(np.sum((a - b) ** 2))def knn_predict(X_train, y_train, X_test, k):distances = [euclidean_distance(X_test, x) for x in X_train]k_indices = np.argsort(distances)[:k]k_nearest_labels = [y_train[i] for i in k_indices]return Counter(k_nearest_labels).most_common(1)[0][0]# 示例数据
X_train = np.array([[1, 2], [4, 6], [5, 2]])
y_train = ['A', 'B', 'A']
X_test = np.array([3, 4])prediction = knn_predict(X_train, y_train, X_test, k=1)
print(f'预测结果: {prediction}') # 输出:预测结果: B
三、曼哈顿距离(Manhattan Distance)🗺️
3.1 定义
曼哈顿距离表示在坐标轴方向上的绝对距离之和,类似于在城市的网格状街道中,从一个点到另一个点所需经过的街区数。
3.2 公式
对于两个 n 维向量或点 p p p 和 q q q,曼哈顿距离定义为:
d Manhattan ( p , q ) = ∑ i = 1 n ∣ p i − q i ∣ d_{\text{Manhattan}}(p, q) = \sum_{i=1}^{n} |p_i - q_i| dManhattan(p,q)=i=1∑n∣pi−qi∣
3.3 特点
- 鲁棒性:对离群值不敏感,计算结果更稳健。
- 计算简便:不涉及平方和开方,计算速度较快。
- 适合高维数据:在高维空间中表现良好。
3.4 在 KNN 中的应用
曼哈顿距离同样可以用于 KNN 算法,尤其在某些数据特征更适合使用绝对差值的场景下。
实际例子
使用上述相同的数据点,计算 X X X 与每个训练样本的曼哈顿距离:
- d ( X , A ) = ∣ 3 − 1 ∣ + ∣ 4 − 2 ∣ = 2 + 2 = 4 d(X, A) = |3 - 1| + |4 - 2| = 2 + 2 = 4 d(X,A)=∣3−1∣+∣4−2∣=2+2=4
- d ( X , B ) = ∣ 3 − 4 ∣ + ∣ 4 − 6 ∣ = 1 + 2 = 3 d(X, B) = |3 - 4| + |4 - 6| = 1 + 2 = 3 d(X,B)=∣3−4∣+∣4−6∣=1+2=3
- d ( X , C ) = ∣ 3 − 5 ∣ + ∣ 4 − 2 ∣ = 2 + 2 = 4 d(X, C) = |3 - 5| + |4 - 2| = 2 + 2 = 4 d(X,C)=∣3−5∣+∣4−2∣=2+2=4
根据曼哈顿距离, B B B 仍然是距离 X X X 最近的邻居。
3.5 代码实现
def manhattan_distance(a, b):return np.sum(np.abs(a - b))def knn_predict_manhattan(X_train, y_train, X_test, k):distances = [manhattan_distance(X_test, x) for x in X_train]k_indices = np.argsort(distances)[:k]k_nearest_labels = [y_train[i] for i in k_indices]return Counter(k_nearest_labels).most_common(1)[0][0]prediction = knn_predict_manhattan(X_train, y_train, X_test, k=1)
print(f'预测结果: {prediction}') # 输出:预测结果: B
四、距离度量的选择对 KNN 的影响 🎯
4.1 影响因素
- 数据特征类型:如果特征之间存在较大的尺度差异,欧几里得距离可能会受到影响,曼哈顿距离可能更适合。
- 异常值:曼哈顿距离对异常值更鲁棒。
- 计算复杂度:曼哈顿距离计算速度更快。
4.2 实际案例分析
假设我们的数据存在一些异常值,例如某个特征的取值远大于其他特征。在这种情况下,欧几里得距离的平方项会放大这种差异,可能导致距离计算失真。而曼哈顿距离由于只计算绝对差值,受异常值影响较小。
4.3 数据标准化的重要性
无论使用哪种距离度量方法,数据标准化都是必要的。标准化可以消除特征之间的尺度差异,使得每个特征对距离计算的影响均等。
from sklearn.preprocessing import StandardScalerscaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform([X_test])
五、总结与建议 📝
5.1 欧几里得距离 vs 曼哈顿距离
-
欧几里得距离
- 优点:直观,反映实际距离。
- 缺点:对离群值敏感,计算复杂度较高。
-
曼哈顿距离
- 优点:计算简单,对离群值不敏感。
- 缺点:在低维空间中可能不如欧几里得距离直观。
5.2 选择建议
-
数据特征类型
- 如果特征是连续型且没有明显的异常值,欧几里得距离是不错的选择。
- 如果存在异常值或特征之间的尺度差异较大,考虑使用曼哈顿距离。
-
维度
- 在高维空间中,曼哈顿距离可能表现更好。
-
计算资源
- 曼哈顿距离计算速度更快,适合大规模数据集。
六、拓展阅读 📖
虽然本文主要讨论了欧几里得距离和曼哈顿距离,但在 KNN 算法中,还有其他距离度量方法可以使用,例如:
-
闵可夫斯基距离(Minkowski Distance):是欧几里得距离和曼哈顿距离的广义形式。
d Minkowski ( p , q ) = ( ∑ i = 1 n ∣ p i − q i ∣ p ) 1 / p d_{\text{Minkowski}}(p, q) = \left( \sum_{i=1}^{n} |p_i - q_i|^p \right)^{1/p} dMinkowski(p,q)=(i=1∑n∣pi−qi∣p)1/p
当 p = 1 p=1 p=1 时,等价于曼哈顿距离;当 p = 2 p=2 p=2 时,等价于欧几里得距离。
-
马氏距离(Mahalanobis Distance):考虑了数据的相关性和尺度差异。
-
切比雪夫距离(Chebyshev Distance):用于衡量在任一维度上的最大差值。
七、结语 🎉
在 KNN 算法中,距离度量的选择直接影响模型的性能和预测结果的准确性。欧几里得距离和曼哈顿距离各有优缺点,选择哪种距离度量应根据具体的数据特点和应用场景。
希望通过本文的讲解,你能更深入地理解这两种距离度量方法,并在实际项目中做出明智的选择。😊
八、参考资料 📚
- 《机器学习》 - 周志华
- 《统计学习方法》 - 李航
- Scikit-Learn 官方文档: https://scikit-learn.org/stable/modules/neighbors.html
作者:Your Name
如果你对本文有任何疑问或建议,欢迎留言交流!