K近邻算法为什么需要归一化?

用户提问:
为什么K近邻需要做归一化后的特征矩阵?

✅ 一图胜千言(先感受下例子)

假设你有两个特征:

如果你用欧几里得距离来判断两个样本的“相似程度”,收入这个特征的数值远大于身高,它就会主导距离结果,让身高几乎不起作用。

✅ WHY(为什么需要归一化)

KNN 是基于“距离”的算法,比如欧几里得距离:

d = √[(x₁ - x₂)² + (y₁ - y₂)² + …]

如果不同特征的数值范围悬殊,比如“年龄(20~60)”和“年收入(几千~几十万)”,大数值的特征会主导距离结果,导致模型忽略其他特征。

归一化就是让所有特征在同一尺度上进行比较。

✅ HOW(怎么归一化)

Min-Max 归一化(缩放到 [0,1])

x_norm = (x - x_min) / (x_max - x_min)

Z-score 标准化(标准差归一)

x_std = (x - μ) / σ

选择标准化方式取决于数据分布是否有离群值、是否服从正态分布等。

✅ WHAT(归一化带来了什么)

✅ HOW TO USE(实际使用)

在 sklearn 中使用:

from sklearn.preprocessing import MinMaxScaler
from sklearn.neighbors import KNeighborsClassifier

scaler = MinMaxScaler()
X_norm = scaler.fit_transform(X)

knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_norm, y)

✅ 总结一句话

KNN 是靠“距离”判断相似度的算法,而距离对数值变化非常敏感。
不做归一化,KNN 就不是在找“最近的邻居”,而是在找“数值大的特征最接近的邻居”。