假设你有两个特征:
如果你用欧几里得距离来判断两个样本的“相似程度”,收入这个特征的数值远大于身高,它就会主导距离结果,让身高几乎不起作用。
KNN 是基于“距离”的算法,比如欧几里得距离:
d = √[(x₁ - x₂)² + (y₁ - y₂)² + …]
如果不同特征的数值范围悬殊,比如“年龄(20~60)”和“年收入(几千~几十万)”,大数值的特征会主导距离结果,导致模型忽略其他特征。
归一化就是让所有特征在同一尺度上进行比较。
x_norm = (x - x_min) / (x_max - x_min)
x_std = (x - μ) / σ
选择标准化方式取决于数据分布是否有离群值、是否服从正态分布等。
在 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 就不是在找“最近的邻居”,而是在找“数值大的特征最接近的邻居”。