KNN算法

KNN算法

算法原理

K-近邻算法,主要用于分类和回归任务,属于监督学习的一种

所谓k近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表,在分类预测时,一般采用多数表决法;而在做回归预测时,一般采用平均值法

分类实现

  1. 计算未知样本到每一个训练样本的距离

  2. 将训练样本根据距离大小升序排列

  3. 取出距离最近的 K 个训练样本

  4. 进行多数表决,统计 K 个样本中哪个类别的样本个数最多

  5. 将未知的样本归属到出现次数最多的类别

回归实现

  1. 计算未知样本到每一个训练样本的距离

  2. 将训练样本根据距离大小升序排列

  3. 取出距离最近的 K 个训练样本

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

  5. 作为将未知的样本预测的值

k值选择

k值过小:过拟合

k值过大:欠拟合

K 值的选择对模型的性能有重要影响。 通常我们通过交叉验证或可视化方法选择最佳的 K值,

距离度量

一般使用欧氏距离

欧氏距离

对应维度数据相减平方就和后开方

曼哈顿距离

城市街区距离 横平竖直,对应维度数据相减求绝对值求和

切比雪夫距离

对应维度数据相减求绝对值求最大

闵可夫斯基距离

上述距离综合

KNN 算法的优缺点

优点

  • 简单易用: KNN 算法的原理简单,易于理解和实现

  • 无需训练: KNN 不需要显式的训练过程,所有的计算都在预测时进行

  • 适用于多分类问题:KNN 可以轻松处理多分类问题

缺点

  • 计算复杂度高: KNN 需要在预测时计算所有样本的距离,当数据集较大时,计算复杂度会很高

  • 对噪声敏感: KNN 对噪声数据较为敏感,噪声数据可能会影响预测结果

  • 需要选择合适的 K 值:K 值的选择对模型的性能有很大影响,选择合适的 K 值是一个挑战

实例

使用 sklearn 中的 load iris 函数加载经典的鸢尾花数据集。这个数据集包含 150 个样本,每个样本有4个特征,目标是将样本分为 3类。

import numpy as np
from sklearn import datasets
from sklearn.model selection import train test splitfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.metrics import accuracy score
# 加载Iris数据集
iris = datasets.load_iris()
X= iris.data[:,:2] #只取前两个特征,便于可视化
y= iris.target

# 将数据集拆分为训练集和测试集
x_train,x_test,y_train,y_test = train_test_split(X, y,test_size=0.3,random_state=42)

# 创建KNN模型,设置K值为3
model = KNeighborsClassifier(n_neighbors=3)
# 训练模型
model.fit(x_train, y_train)
#在测试集上进行预测
y_pred =model.predict(x_test)
# 计算准确率
accuracy = accuracy score(y_test,y_pred)print(f"KNN模型的准确率:{accuracy:.4f}")
 
posted @ 2025-09-04 09:13  上好佳28  阅读(23)  评论(0)    收藏  举报