一、KNN 算法核心思想
K - 近邻算法(K Nearest Neighbor,简称 KNN)是一种简单且经典的监督学习算法,核心思想可以概括为:。
KNN 是一种监督学习算法,核心思想基于样本间距离找出 K 个最近邻进行分类或回归预测。K 值选择影响模型泛化能力,过小易过拟合,过大易欠拟合。常用距离度量包括欧氏、曼哈顿、切比雪夫及闵可夫斯基距离。特征预处理如归一化和标准化用于消除量纲差异,提升模型效果。KNN 优点是原理简单无需显式训练,缺点是预测效率低且对高维数据敏感。

K - 近邻算法(K Nearest Neighbor,简称 KNN)是一种简单且经典的监督学习算法,核心思想可以概括为:。
KNN(K Nearest Neighbors)是一种惰性学习(lazy learning)算法,因为它不会对训练数据进行显式的学习或建模,只是把训练数据存储起来,直到测试阶段才进行计算,通过计算未知样本与训练集中所有样本的"距离",找出最相似的 K 个邻居,根据这些邻居的类别来决定未知样本的类别。
KNN 不仅适用于分类问题,也可用于回归问题,两者的处理流程相似但目标不同:
| 任务类型 | 核心目标 | 决策规则 | 适用场景举例 |
|---|---|---|---|
| 分类 | 预测离散的类别标签 | 统计 K 个近邻中占比最高的类别 | 鸢尾花分类、手写数字识别 |
| 回归 | 预测连续的数值结果 | 计算 K 个近邻目标值的算术平均值 | 房价预测、销量预测 |
样本的相似性通过距离来衡量,距离越近则相似度越高,KNN 中最常用的是欧氏距离,后续会详细介绍多种距离度量方式。
K 值是 KNN 算法中最重要的超参数,其选择直接影响模型效果:
处理流程:
SKlearn API:
from sklearn.neighbors import KNeighborsClassifier # 完整参数示例(含核心参数说明)
knn_clf = KNeighborsClassifier(
n_neighbors=5, # 核心:选取的邻居数量,默认 5
weights='uniform', # 权重方式:'uniform'(等权重)/'distance'(距离越近权重越高)
algorithm='auto', # 近邻搜索算法:'auto'/'ball_tree'/'kd_tree'/'brute'
p=2, # 闵可夫斯基距离的 p 值:p=1(曼哈顿)/p=2(欧式)/p→∞(切比雪夫)
metric='minkowski' # 距离度量方式:默认'minkowski',可指定'euclidean'/'manhattan'等
)
处理流程:
SKlearn API:
from sklearn.neighbors import KNeighborsRegressor # 完整参数示例(含核心参数说明)
knn_reg = KNeighborsRegressor(
n_neighbors=5, # 核心:选取的邻居数量,默认 5
weights='uniform', # 权重方式:'uniform'(等权重平均)/'distance'(加权平均)
algorithm='auto', # 近邻搜索算法:同分类器,auto 为推荐值
p=2, # 距离 p 值:p=2 对应欧式距离(默认)
metric='minkowski' # 距离度量:默认闵可夫斯基,兼容多种距离
)

欧式距离是两点之间的直线距离,公式如下:

欧式距离是两适用于连续型特征,是 KNN 默认的距离度量方式。

也叫'城市街区距离',计算两点在各维度上的绝对差之和:适用于特征维度具有'正交性'的场景(如路径规划)。公式如下

适用于特征维度具有'正交性'的场景(如路径规划)。

取各维度绝对差的最大值适用于'棋盘距离'类场景(如国际象棋国王移动)。
公式如下:


是欧氏距离、曼哈顿距离、切比雪夫距离的通用形式:
特征的单位 / 大小差异过大(如'身高(cm)'和'收入(元)'),会导致距离计算被数值大的特征支配,模型无法学习到其他特征的贡献。
将数据映射到 [0,1] 区间(可自定义范围),公式:

SKlearn 实现:
from sklearn.preprocessing import MinMaxScaler # 初始化归一化器
scaler = MinMaxScaler(feature_range=(0,1)) # 拟合并转换数据
data_scaled = scaler.fit_transform(data)
⚠️ 缺点:易受异常值影响,鲁棒性差,适合小样本、无异常值场景。
import numpy as np
from sklearn.preprocessing import MinMaxScaler
# 模拟房价特征数据:[面积 (㎡), 总价 (万元), 楼层]
house_data = np.array([
[80, 200, 5],
[100, 300, 10],
[120, 400, 15],
[90, 250, 8]
])
# 1. 初始化归一化器(默认映射到 [0,1])
scaler = MinMaxScaler(feature_range=(0, 1))
# 2. 拟合并转换数据
house_scaled = scaler.fit_transform(house_data)
print("原始数据:")
print(house_data)
print("\n归一化后数据:")
print(house_scaled)
print("\n各特征最小值:", scaler.data_min_)
print("各特征最大值:", scaler.data_max_)
输出结果:
原始数据: [[ 80 200 5] [100 300 10] [120 400 15] [ 90 250 8]] 归一化后数据: [[0. 0. 0. ] [0.5 0.5 0.5 ] [1. 1. 1. ] [0.25 0.25 0.3 ]] 各特征最小值: [ 80. 200. 5.] 各特征最大值: [120. 400. 15.]
将数据转换为均值为 0,标准差为 1的标准正态分布,公式:
SKlearn 实现:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)
✅ 优点:受异常值影响小,适用于大数据集、有异常值的场景,是 KNN 的首选预处理方式。
import numpy as np
from sklearn.preprocessing import StandardScaler
# 模拟学生成绩数据:[数学,英语,语文](含异常值:最后一行是满分异常)
score_data = np.array([
[60, 70, 80],
[75, 85, 90],
[80, 82, 78],
[90, 88, 92],
[100, 100, 100] # 异常值
])
# 1. 初始化标准化器
scaler = StandardScaler()
# 2. 拟合并转换数据
score_scaled = scaler.fit_transform(score_data)
print("原始数据:")
print(score_data)
print("\n标准化后数据:")
print(np.round(score_scaled, 2)) # 保留 2 位小数
print("\n各特征均值:", np.round(scaler.mean_, 2))
print("各特征标准差:", np.round(scaler.scale_, 2))
输出结果:
原始数据: [[ 60 70 80] [ 75 85 90] [ 80 82 78] [ 90 88 92] [100 100 100]] 标准化后数据: [[-1.47 -1.53 -0.8 ] [-0.45 0.21 0.2 ] [-0.12 -0.12 -1.01] [ 0.51 0.54 0.41] [ 1.53 0.9 1.2 ]] 各特征均值: [81. 85. 88. ] 各特征标准差: [14.25 9.83 10.02]
小样本、低维度、数据分布均匀的分类 / 回归问题(如推荐系统、简单图像识别)。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online