文章目录
- 1. K近邻算法(K-Nearest Neighbors, KNN)原理
- 1.1. K近邻算法是什么算法?
- 1.2. 核心思想
- 2. K近邻算法的步骤
- 2.1. 选择K值
- 2.2. 计算距离
- 2.3. 选择最近邻:
- 2.4. 做出预测:
- 3. K值的选择
- 4. 数据标准化
- 5. 优缺点
- 6. 样例代码
- 7。优化技巧
- 8. 归纳
1. K近邻算法(K-Nearest Neighbors, KNN)原理
1.1. K近邻算法是什么算法?
K近邻(KNN)是一种惰性学习(Lazy Learning) 算法,适用于分类和回归任务。其核心思想是:“相似的样本在特征空间中距离相近”,通过计算待预测样本与训练样本的距离,找到最近的K个邻居,基于这些邻居的标签进行预测。
1.2. 核心思想
给定一个待分类(或回归)的数据点,找到训练集中距离该数据点最近的K个邻居,然后通过这些邻居的标签(分类问题)或数值(回归问题)来预测该数据点的标签或数值。
-
分类任务:待预测样本的类别由其K个最近邻居的**多数投票(Majority Voting)**决定。
-
回归任务:待预测样本的值由其K个最近邻居的平均值决定。
-
关键参数:
-
K值:选择最近的K个邻居(影响模型复杂度)。
-
距离度量:计算样本间距离的方法(如欧氏距离、曼哈顿距离)。
-
2. K近邻算法的步骤
2.1. 选择K值
- 选择K个最近邻居。通常K是一个小的整数,常见的选择有1、3、5等。
2.2. 计算距离
计算待分类点与所有训练集点之间的距离,常用的距离度量包括欧几里得距离、曼哈顿距离等。
常用距离公式:
-
欧氏距离(Euclidean Distance): d ( x , y ) = ∑ i = 1 n ( x i − y i ) 2 d(x, y) = \sqrt{\sum_{i=1}^{n}(x_i - y_i)^2} d(x,y)=i=1∑n(xi−yi)2
-其中 x = ( x 1 , x 2 , . . . , x n ) x=(x_1,x_2,...,x_n) x=(x1,x2,...,xn)和 y = ( y 1 , y 2 , . . . , x n ) y=(y_1,y_2,...,x_n) y=(y1,y2,...,xn) 是两个数据点 -
曼哈顿距离(Manhattan Distance): d ( x , y ) = ∑ i = 1 n ∣ x i − y i ∣ d(x, y) = \sum_{i=1}^{n} |x_i - y_i| d(x,y)=i=1∑n∣xi−yi∣
-
余弦相似度(Cosine Similarity)(适用于高维稀疏数据): cos ( θ ) = x ⋅ y ∥ x ∥ ⋅ ∥ y ∥ \cos(\theta) = \frac{x \cdot y}{\|x\| \cdot \|y\|} cos(θ)=∥x∥⋅∥y∥x⋅y
2.3. 选择最近邻:
- 根据距离,选择距离待分类点最近的K个邻居。
2.4. 做出预测:
- 分类:如果是分类问题,则返回K个邻居中最多的类别。
- 回归:如果是回归问题,则返回K个邻居的平均值或中位数。
返回预测结果。
3. K值的选择
-
K太小(如K=1):
- 模型复杂,容易过拟合(对噪声敏感)。
- 决策边界不规则。
-
K太大(如K=N):
-
模型简单,可能欠拟合(忽略局部特征)。
-
决策边界趋于平滑。
-
-
优化方法:
- 使用交叉验证(Cross-Validation)选择最佳K值。
4. 数据标准化
由于KNN依赖距离计算,不同特征量纲差异会导致某些特征主导距离计算。因此,需进行标准化:
- Min-Max归一化: x ′ = m a x ( X ) − m i n ( X ) x − m i n ( X ) x^′ = \frac{max(X)−min(X)}{x−min(X)} x′=x−min(X)max(X)−min(X)
- Z-Score标准化: x ′ = x − μ σ x^′=\frac{x−μ}{σ} x′=σx−μ
5. 优缺点
-
✅ 优点
- 简单直观,易于实现。
- 无需训练(惰性学习,仅存储数据)。
- 适用于多分类和回归问题。
- 对数据分布无假设(非参数方法)。
-
❌ 缺点
- 计算复杂度高(预测时需计算所有样本距离)。
- 对高维数据效果差(维度灾难,Curse of Dimensionality)。
- 对异常值和噪声敏感。
- 需要特征标准化。
- 选择K值困难(K值过小容易过拟合,K值过大可能导致欠拟合。)
6. 样例代码
# 导入必要的库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt# 加载鸢尾花数据集
data = load_iris()
X = data.data
y = data.target# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 创建K近邻分类器,选择K=3
knn = KNeighborsClassifier(n_neighbors=3)# 训练K近邻模型
knn.fit(X_train, y_train)# 预测测试集
y_pred = knn.predict(X_test)# 输出准确率
print(f"Accuracy: {accuracy_score(y_test, y_pred):.4f}")
7。优化技巧
-
调整K值:用网格搜索(GridSearchCV)选择最佳K。
-
加权投票:近邻的投票可按距离加权(如weights=‘distance’)。
-
降维:对高维数据先用PCA降维。
-
近似最近邻(ANN):用KD-Tree、Ball-Tree或HNSW加速搜索(适合大规模数据)。
8. 归纳
-
KNN的核心:基于邻居的投票或平均进行预测。
-
关键参数:
-
K值(控制模型复杂度)。
-
距离度量(欧氏/曼哈顿/余弦)。
-
-
适用场景:
-
小规模、低维数据。
-
需要快速原型验证的分类/回归问题。
-