K 近邻算法(K - Nearest Neighbors,KNN)
基本原理
- KNN 算法的核心思想是根据距离度量来判断未知样本点的类别。对于一个待分类的样本,在训练集中找到与它距离最近的 K 个样本(通常使用欧氏距离、曼哈顿距离等)。
- 这 K 个最近邻样本中占多数的类别,就被预测为待分类样本的类别。
算法步骤
- 数据准备
- 收集和整理训练数据集,数据集应包含特征向量和对应的类别标签。
- 距离计算
- 计算测试样本与训练集中每个样本之间的距离。常用的距离公式有:
- 欧氏距离:d(x,y)=∑i=1n(xi−yi)2d(x,y)=\sqrt{\sum_{i = 1}^{n}(x_i - y_i)^2}d(x,y)=∑i=1n(xi−yi)2,其中xxx和yyy是两个样本的特征向量,nnn是特征的数量。
- 曼哈顿距离:d(x,y)=∑i=1n∣xi−yi∣d(x,y)=\sum_{i = 1}^{n}|x_i - y_i|d(x,y)=∑i=1n∣xi−yi∣。
- 计算测试样本与训练集中每个样本之间的距离。常用的距离公式有:
- 选择 K 值
- 确定近邻的数量 K。K 值的选择会影响算法的性能:
- K 值较小,模型容易受到噪声的影响,导致过拟合。
- K 值较大,会使模型变得简单,可能会忽略数据中的局部特征,导致欠拟合。
- 确定近邻的数量 K。K 值的选择会影响算法的性能:
- 确定近邻
- 根据距离度量结果,选择距离测试样本最近的 K 个训练样本。
- 分类决策
- 根据这 K 个近邻的类别标签进行投票,将出现次数最多的类别作为测试样本的预测类别。
算法特点
- 优点
- 简单直观,易于理解和实现。
- 对异常值不敏感。
- 适用于多分类问题。
- 缺点
- 计算复杂度高,尤其是当训练集规模很大时,计算每个测试样本与所有训练样本的距离需要大量的时间和计算资源。
- 需要存储所有的训练数据,对内存要求较高。
- 对 K 值和距离度量的选择比较敏感。
应用场景
- 分类问题,如图像识别(识别图像中的物体属于哪一类)、文本分类(判断一篇文章属于哪个主题类别)等。
- 回归问题,通过对 K 个近邻的数值输出进行平均或加权平均来预测未知样本的数值。
#加载数据集
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
iris = load_iris()
x = iris.data
y = iris.target
x.shape,y.shape
#划分数据集
x_train,x_test,y_train,y_test = train_test_split(x,y,train_size = 0.7,random_state=233,stratify=y)
x_train.shape,x_test.shape,y_train.shape,y_test.shape
#超参数搜索
from sklearn.model_selection import GridSearchCV
params = {#参数及其范围
"n_neighbors":[n for n in range(1,20)],#K
'weights':['uniform','distance'],#权重
'p':[p for p in range(1,7)]#欧氏距离
}
grid = GridSearchCV(
#网格搜索
estimator=KNeighborsClassifier(),#封装数据
param_grid=params,
n_jobs=-1#自动设定并行任务即可
)
#预测
grid.fit(x_train,y_train)
grid.best_params_
grid.best_score_
grid.best_estimator_.predict(x_test)#传入测试集
grid.best_estimator_.score(x_test,y_test)

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



