KNN 算法知识点全面解析

KNN 算法知识点

知识导图

KNN算法
├─ 核心:K近邻 → 多数表决/平均值
├─ 流程:距离计算 → 排序 → 取K邻 → 决策
├─ 距离:欧氏、曼哈顿、切比雪夫、闵可夫斯基
├─ K值:小→过拟合;大→欠拟合;调优=网格搜索+交叉验证
├─ 预处理:归一化(鲁棒差)、标准化(推荐)
├─ API:KNeighborsClassifier/Regressor
└─ 案例:电影分类、鸢尾花、手写数字识别

1 KNN 算法简介

名词解释

KNN(K-Nearest Neighbor)K 近邻算法
根据样本在特征空间中K 个最相似邻居的类别,通过多数表决判断自身类别;回归任务取 K 个邻居目标值的平均值

核心思想

样本距离越近 → 相似度越高 → 类别 / 属性越接近。


2 KNN 执行流程

2.1 分类流程(5 步)

  1. 计算未知样本到所有训练样本的距离

  2. 按距离升序排序

  3. 选取最近的 K 个样本

  4. 统计 K 个样本的类别频次

  5. 多数表决 → 确定类别

2.2 回归流程(5 步)

  1. 计算未知样本到所有训练样本的距离

  2. 按距离升序排序

  3. 选取最近的 K 个样本

  4. 计算 K 个样本目标值的平均值

  5. 平均值作为预测结果


3 距离度量方法

3.1 欧氏距离

在这里插入图片描述

3.2 曼哈顿距离

在这里插入图片描述

3.3 切比雪夫距离

在这里插入图片描述

3.4闵可夫斯基距离

A

3.5.1 三种常见距离汇总

欧氏距离:d = √[(x1-x2)² + (y1-y2)²]
曼哈顿距离:d = |x1-x2| + |y1-y2|
切比雪夫距离:d = max(|x1-x2|, |y1-y2|)
闵可夫斯基距离:d = (Σ|xi-yi|^p)^(1/p)

3.5.2 三种距离单位圆画图

在这里插入图片描述


4 特征预处理

4.1 为什么预处理

特征量纲 / 数值范围差异大 → 距离被大数值特征主导 → 模型失效。

在这里插入图片描述

4.2 归一化后分布

在这里插入图片描述

4.3 归一化代码

from sklearn.preprocessing import MinMaxScaler
data = [[90, 2, 10], [60, 4, 15], [75, 3, 13]]
trans = MinMaxScaler()
print(trans.fit_transform(data))

4.4 标准化分布

在这里插入图片描述
在这里插入图片描述

4.5 标准化代码

from sklearn.preprocessing import StandardScaler
data = [[90, 2, 10], [60, 4, 15], [75, 3, 13]]
trans = StandardScaler()
print(trans.fit_transform(data))

4.6 归一化 vs 标准化(对比辨析)

方法 抗异常值 适用场景 推荐度
归一化 小数据、干净数据
标准化 大数据、嘈杂数据

5 K 值选择与超参数调优

5.1 K 值影响

  • K 过小:模型复杂 → 过拟合

  • K 过大:模型简单 → 欠拟合

  • K=N:永远预测多数类

5.2 交叉验证及网格搜索原理

在这里插入图片描述
在这里插入图片描述

5.3 网格搜索实例

在这里插入图片描述

这段代码是K 近邻(KNN)分类器的网格搜索调参代码,功能是自动遍历所有参数组合,找出 5 折交叉验证下效果最好的超参数。

# 1. 导入依赖库
from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 2. 加载示例数据(鸢尾花数据集)
data = load_iris()
X = data.data  # 特征
y = data.target  # 标签

# 3. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 4. 定义参数网格
param_grid = {
    'n_neighbors': [1, 3, 5, 7],
    'weights': ['uniform', 'distance'],
    'p': [1, 2]
}

# 5. 网格搜索(5折交叉验证)
grid = GridSearchCV(KNeighborsClassifier(), param_grid, cv=5)
grid.fit(X_train, y_train)

# 6. 输出结果
print("最优超参数:", grid.best_params_)
print("最优交叉验证准确率:", round(grid.best_score_, 4))

6 sklearn KNN API

6.1 分类 API

from sklearn.neighbors import KNeighborsClassifier
X = [[0],[1],[2],[3]]
y = [0,0,1,1]
knn = KNeighborsClassifier(3)
knn.fit(X, y)
print(knn.predict([[4]]))

6.2 回归 API

from sklearn.neighbors import KNeighborsRegressor
X = [[0,0,1],[1,1,0],[3,10,10]]
y = [0.1,0.2,0.3]
knn = KNeighborsRegressor(2)
knn.fit(X, y)
print(knn.predict([[3,11,10]]))

7 实战案例

7.1 鸢尾花分类(完整代码)

在这里插入图片描述

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    iris.data, iris.target, test_size=0.2, random_state=22
)
trans = StandardScaler()
X_train = trans.fit_transform(X_train)
X_test = trans.transform(X_test)

knn = KNeighborsClassifier(3)
knn.fit(X_train, y_train)
print('准确率:', knn.score(X_test, y_test))

7.2 手写数字识别(完整代码)

在这里插入图片描述
在这里插入图片描述

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

data = pd.read_csv('手写数字识别.csv')
X = data.iloc[:,1:] / 255
y = data.iloc[:,0]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

knn = KNeighborsClassifier(3)
knn.fit(X_train, y_train)
print('准确率:', knn.score(X_test, y_test))

8 核心考点总结

8.1 核心考点总结

  1. KNN 是惰性学习,无显式训练过程

  2. 距离度量 + K 值 是两大核心

  3. 必须做标准化,否则距离计算失真

  4. 超参数调优 = 网格搜索 + 交叉验证

  5. 适合低维、小样本、分类 / 回归任务

8.2 核心考点解析

KNN 是惰性学习,无显式训练过程

意思:KNN 不训练模型fit\(\) 只是把数据存起来,不计算任何参数、不学习任何规则。

关键点:

  • 训练极快(只是存数据)

  • 预测很慢(现场算所有距离)

  • 没有 “学习” 过程,所以叫惰性学习

一句话背:KNN 不训练,只存数据;预测时临时算距离。


距离度量 + K 值 是两大核心

KNN 算法只靠这两个东西决定结果,别的都不重要。

① 距离度量(怎么算 “近不近”)
  • p=1 曼哈顿距离(格子走法)

  • p=2 欧氏距离(直线距离)

② K 值(找几个邻居投票)
  • K 太小 → 过拟合(太敏感,受噪声影响)

  • K 太大 → 欠拟合(太笼统,失去局部特征)

一句话背:距离算相似度,K 值定模型复杂度。


必须做标准化,否则距离计算失真

这是 KNN 最容易丢分、最容易错的考点!

为什么必须标准化?

因为 KNN 完全依赖距离。如果特征量纲不一样(比如一个 0~1,一个 0~10000),数值大的特征会直接 “吃掉” 距离!

例子:

  • 身高:170cm

  • 收入:10000 元

不标准化 → 收入主导距离 → 模型完全失效。

标准化方法:StandardScalerMinMaxScaler

一句话背:KNN 必须标准化,不标准必失真。


超参数调优 = 网格搜索 + 交叉验证

KNN 没有要学习的参数,只能手动调超参数

要调的参数:
  • n\_neighbors:K 值

  • weights:uniform / distance

  • p:距离公式

调参方法固定搭配:

GridSearchCV + 5 折交叉验证

作用:

  • 遍历所有参数组合

  • 自动选出最优的一组

  • 防止过拟合,保证泛化能力

一句话背:KNN 调参 = 网格搜索 + 交叉验证。


适合低维、小样本、分类 / 回归任务

KNN 优点缺点都很明显,所以使用场景非常固定。

✅ 适合
  • 数据维度不高(低维数据)

  • 数据量不大(小样本)

  • 分类任务、回归任务都能做

❌ 不适合
  • 高维数据(维度灾难,距离失效)

  • 大数据量(预测太慢)

  • 实时性要求高的场景

一句话背:KNN 适合低维小样本,大数据高维别用它。


Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐