目录
- KNN 算法简介(思想 + 分类 / 回归流程)
- KNN 算法 API 介绍(分类 + 回归实现)
- 距离度量(常用距离计算方法)
- 特征预处理(归一化 + 标准化)
1. KNN 算法简介
1.1 学习目标
- 理解 K 近邻(KNN)算法的核心思想
- 掌握 KNN 分类问题的处理流程
- 掌握 KNN 回归问题的处理流程
1.2 核心内容
1.2.1 KNN 算法思想
- 定义:K 近邻算法(K Nearest Neighbor,KNN)是一种 “基于相似性” 的算法,核心逻辑是 “看邻居定类别 / 值”——
若一个样本在特征空间中,其最相似的k 个训练样本(邻居)中,大多数属于某类别(分类)或平均值为某值(回归),则该样本也归为此类别 / 值。
- 关键问题:样本相似性通过 “距离” 衡量(默认欧氏距离,详见第 3 章)。
- 解决问题:同时支持分类问题(如 “判断邮件是否为垃圾邮件”)和回归问题(如 “预测房屋价格”)。
1.2.2 KNN 分类流程(5 步)
- 计算未知样本到每一个训练样本的距离(如欧氏距离);
- 将所有训练样本按 “距离从小到大” 升序排列;
- 从排序结果中,取出距离最近的k 个训练样本(k 为超参数,默认 5);
- 对这 k 个样本进行 “多数表决”:统计每个类别的样本数量;
- 未知样本归属到 “数量最多的类别”。
1.2.3 KNN 回归流程(5 步)
- 计算未知样本到每一个训练样本的距离(与分类一致);
- 将所有训练样本按 “距离从小到大” 升序排列;
- 取出距离最近的k 个训练样本;
- 计算这 k 个样本的 “目标值平均值”;
- 该平均值即为未知样本的预测值。
1.3 小总结
- 核心思想:近朱者赤,近墨者黑(通过 k 个邻居推断样本属性);
- 分类靠 “多数表决”,回归靠 “均值计算”;
- 距离计算是核心(决定邻居是谁),k 值是关键超参数(影响结果)。
2. KNN 算法 API 介绍
2.1 学习目标
- 掌握 KNN 分类问题的 API 调用方法
- 掌握 KNN 回归问题的 API 调用方法
2.2 核心内容(基于 scikit-learn)
2.2.1 KNN 分类 API
- 类名:sklearn.neighbors.KNeighborsClassifier
- 关键参数:
n_neighbors:int 类型,可选(默认 = 5)—— 指定 “邻居数量 k”。
- 核心方法:
fit(X, y):用训练数据(X = 特征,y = 标签)训练模型;
predict(X):用训练好的模型预测未知样本(X = 未知样本特征),返回预测标签。
- 代码示例:
|
from sklearn.neighbors import KNeighborsClassifier def knn_classification_demo(): # 1. 准备训练数据(特征X:单特征,标签y:二分类) X_train = [[0], [1], [2], [3]] # 训练样本特征(如“考试分数”) y_train = [0, 0, 1, 1] # 训练样本标签(如“是否及格”:0=不及格,1=及格)
# 2. 初始化KNN分类器(k=1,取1个最近邻居) estimator = KNeighborsClassifier(n_neighbors=1)
# 3. 训练模型 estimator.fit(X_train, y_train)
# 4. 预测未知样本(如“分数=4”) y_pred = estimator.predict([[4]])
# 5. 输出结果(预期:[1],即“及格”) print("未知样本预测标签:", y_pred) # 调用函数 knn_classification_demo() |
2.2.2 KNN 回归 API
- 类名:sklearn.neighbors.KNeighborsRegressor
- 关键参数:
n_neighbors:int 类型,可选(默认 = 5)—— 指定 “邻居数量 k”(与分类一致)。
- 核心方法:
fit(X, y):用训练数据(X = 特征,y = 目标值)训练模型;
predict(X):预测未知样本,返回预测目标值(与分类不同,回归返回连续值)。
- 代码示例:
|
from sklearn.neighbors import KNeighborsRegressor def knn_regression_demo(): # 1. 准备训练数据(特征X:三维特征,目标值y:连续值) X_train = [[0, 0, 1], [1, 1, 0], [3, 10, 10], [4, 11, 12]] # 如“面积、房龄、楼层” y_train = [0.1, 0.2, 0.3, 0.4] # 如“房屋单价(万元/㎡)”
# 2. 初始化KNN回归器(k=2,取2个最近邻居) estimator = KNeighborsRegressor(n_neighbors=2)
# 3. 训练模型 estimator.fit(X_train, y_train)
# 4. 预测未知样本(如“面积=3,房龄=11,楼层=10”) y_pred = estimator.predict([[3, 11, 10]])
# 5. 输出结果(预期:(0.3+0.4)/2=0.35) print("未知样本预测目标值:", y_pred) # 调用函数 knn_regression_demo() |
2.3 小总结
- 分类用KNeighborsClassifier,返回离散标签;回归用KNeighborsRegressor,返回连续值;
- 核心参数n_neighbors(k 值)需手动指定,默认 5;
- 调用流程统一:初始化→训练(fit)→预测(predict)。
3. 距离度量
3.1 学习目标
- 掌握欧氏距离的计算方法
- 掌握曼哈顿距离的计算方法
- 了解切比雪夫距离的计算方法
- 了解闵可夫斯基距离的通用公式
3.2 核心内容(基于闵可夫斯基距离通用公式)
3.2.1 通用公式:闵可夫斯基距离
对于两个 d 维样本和
,闵可夫斯基距离公式为:
其中,p为 “距离参数”,不同p对应不同距离类型。
3.2.2 常用距离类型(p 值对应)
|
距离类型 |
p 值 |
公式(d 维样本) |
通俗理解 |
适用场景 |
|
曼哈顿距离 |
p=1 |
|
|
$ |
|
欧氏距离 |
p=2 |
|
“直线距离”(两点之间最短路径) |
大多数连续特征场景(如 KNN 默认) |
|
切比雪夫距离 |
p→∞ |
3.2.3 示例计算(以 2 维样本为例)
设样本=(1,2),
=(4,6):
- 曼哈顿距离(p=1):|1-4| + |2-6| = 3 + 4 = 7;
- 欧氏距离(p=2):
;
- 切比雪夫距离(p→∞):
。
3.3 小总结
- 闵可夫斯基距离是 “距离家族” 的通用公式,p 值决定具体类型;
- KNN 默认用欧氏距离(p=2),需根据场景调整(如城市数据用曼哈顿距离);
- 距离计算受特征单位影响(如 “身高(m)” 和 “体重(kg)”),需先做特征预处理(详见第 4 章)。
4. 特征预处理
4.1 学习目标
- 知道特征预处理(归一化 / 标准化)的必要性
- 会用归一化 API 处理数据
- 会用标准化 API 处理数据
- 理解归一化与标准化的适用场景
4.2 核心内容
4.2.1 为什么需要预处理?
特征单位 / 量级差异会 “支配” 距离计算,导致模型忽略小量级特征。
- 示例:特征 “身高(m,1.7 左右)”“体重(kg,70 左右)”“视力(0.2-2.0)”——
体重的量级(70)远大于视力(2.0),计算距离时,体重差异会主导结果,视力的影响被忽略,导致模型偏差。
4.2.2 归一化(Min-Max Scaling)
- 定义:将原始数据映射到指定区间(默认 [0,1]),公式为:
其中,= 特征最小值,
= 特征最大值,mi= 目标区间最小值(默认 0),mx= 目标区间最大值(默认 1)。
- API:sklearn.preprocessing.MinMaxScaler(feature_range=(0,1))
- feature_range:指定映射区间(默认 (0,1));
- fit_transform(X):对特征矩阵 X 做归一化(先计算 X 的 min/max,再变换)。
- 代码示例:
|
import numpy as np from sklearn.preprocessing import MinMaxScaler def minmax_scaler_demo(): # 1. 准备原始数据(特征矩阵:3个样本,4个特征) data = [[90, 2, 10, 40], # 如“成绩、年龄、时长、分数” [60, 4, 15, 45], [75, 3, 13, 46]]
# 2. 初始化归一化器(映射到[0,1]) scaler = MinMaxScaler(feature_range=(0, 1))
# 3. 执行归一化 data_scaled = scaler.fit_transform(data)
# 4. 输出结果(所有特征值均在[0,1]之间) print("归一化后数据:\n", data_scaled) # 调用函数 minmax_scaler_demo() |
4.2.3 标准化(Standard Scaling)
- 定义:将原始数据转换为 “均值 = 0,标准差 = 1” 的标准正态分布,公式为:
其中,\mu= 特征均值,\sigma= 特征标准差。
- API:sklearn.preprocessing.StandardScaler()
- 无区间参数(固定转为均值 0、标准差 1);
- fit_transform(X):对特征矩阵 X 做标准化(先计算 X 的
和
,再变换)。
- 代码示例:
|
import numpy as np from sklearn.preprocessing import StandardScaler def standard_scaler_demo(): # 1. 准备原始数据(同归一化示例) data = [[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]]
# 2. 初始化标准化器 scaler = StandardScaler()
# 3. 执行标准化 data_scaled = scaler.fit_transform(data)
# 4. 输出结果(均值≈0,标准差≈1) print("标准化后数据:\n", data_scaled) print("各特征均值:", scaler.mean_) # 输出原始数据各特征的均值 print("各特征方差:", scaler.var_) # 输出原始数据各特征的方差(标准差=√方差) # 调用函数 standard_scaler_demo() |
4.2.4 归一化 vs 标准化:适用场景
|
对比维度 |
归一化(Min-Max) |
标准化(Standard) |
|
异常点影响 |
敏感(异常点会改变 x_min/x_max) |
不敏感(少量异常点对 μ/σ 影响小) |
|
数据要求 |
需知道特征的 min/max(依赖数据范围) |
无需知道范围(仅需 μ/σ) |
|
适用场景 |
传统小数据、无异常点(如实验室数据) |
现代大数据、有异常点(如用户行为数据) |
|
常用度 |
较低 |
较高(KNN 等距离类算法首选) |
4.3 小总结
- 预处理核心目的:消除特征量级差异,避免距离计算被支配;
- 归一化映射到固定区间,标准化转为标准正态分布;
- 实际项目中,标准化优先用(抗异常点,适配大数据)。
2万+

被折叠的 条评论
为什么被折叠?



