k 近邻算法(k - Nearest Neighbors,KNN)详细解释(带示例)
·
目录
基本概念
k 近邻算法是一种基本的有监督机器学习算法,既可以用于分类问题,也可以用于回归问题。其核心思想非常简单直观:对于一个待分类或待预测的样本,在训练数据集中找到与它距离最近的 k 个样本,然后根据这 k 个样本的类别或数值来确定待分类样本的类别或预测值。
工作原理
分类问题
在分类任务中,通过计算待分类样本与训练集中所有样本的距离,选取距离最近的 k 个样本,统计这 k 个样本中各类别的数量,将待分类样本划分到数量最多的那个类别。例如,在一个水果分类问题中,已知苹果和橙子的一些特征(如颜色、大小等)作为训练数据,对于一个新的水果样本,计算它与已知水果的距离,找到最近的 k 个水果,如果这 k 个水果中苹果的数量多于橙子,那么就将新水果分类为苹果。
回归问题
在回归任务中,同样先找到距离待预测样本最近的 k 个样本,然后将这 k 个样本的数值取平均值(或进行加权平均),将这个平均值作为待预测样本的预测值。比如,预测房价时,根据房屋的面积、房间数量等特征,找到与之最相似的 k 个房屋,将这 k 个房屋的价格求平均,得到待预测房屋的价格。
距离度量
常见的距离度量方法有欧氏距离、曼哈顿距离等。以二维空间为例,两个样本点 和
的欧氏距离计算公式为:
曼哈顿距离计算公式为:
k 值的选择
k 值的选择对 KNN 算法的性能有重要影响。
- 如果 k 值过小,模型容易受到噪声和异常值的影响,导致过拟合。例如,在分类时可能因为个别离群点的干扰而做出错误的分类。
- 如果 k 值过大,会包含过多不相关的样本,可能会忽略掉局部的特征信息,导致欠拟合。
示例
假设有一个简单的二维数据集,包含两类样本:蓝色点和红色点。对于一个新的绿色点,我们要使用 KNN 算法对其进行分类。
- 首先,计算绿色点与所有蓝色点和红色点的距离。
- 假设我们选择 k = 3,那么找到距离绿色点最近的 3 个点。
- 如果这 3 个点中蓝色点有 2 个,红色点有 1 个,那么根据多数表决原则,将绿色点分类为蓝色类别。
Python 案例
import numpy as np
import matplotlib.pyplot as plt
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
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
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值为5
knn = KNeighborsClassifier(n_neighbors=5)
# 训练模型
knn.fit(X_train, y_train)
# 预测测试集
y_pred = knn.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"KNN模型的准确率: {accuracy:.2f}")
# 可视化不同k值下的准确率(可选)
k_range = range(1, 31)
scores = []
for k in k_range:
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
scores.append(accuracy_score(y_test, y_pred))
plt.plot(k_range, scores)
plt.xlabel('Value of k for KNN')
plt.ylabel('Testing Accuracy')
plt.title('KNN: Accuracy vs. Value of k')
plt.show()
代码解释
- 数据加载与预处理:使用
load_iris()加载鸢尾花数据集,然后使用train_test_split函数将数据集划分为训练集和测试集,测试集占比为 30%。 - 模型创建与训练:创建一个 KNN 分类器
KNeighborsClassifier,并设置 k 值为 5。使用训练集数据对模型进行训练。 - 模型预测与评估:使用训练好的模型对测试集进行预测,使用
accuracy_score函数计算预测结果的准确率。 - 可视化不同 k 值下的准确率(可选):通过循环尝试不同的 k 值(从 1 到 30),计算每个 k 值下模型的准确率,并将结果绘制成折线图,帮助我们观察 k 值对模型性能的影响。
更多推荐

所有评论(0)