文章目录
- 一、KNN 算法概述
- 1.1 算法原理
- 1.2 KNN 的优缺点
- 1.3 K 值的选择
- 二、Python 实现 KNN 案例
- 2.1 使用 KNN 算法进行手写数字识别
- 2.2 使用 Python 实现 KNN 分类
- 三、总结
KNN(K-Nearest Neighbors,K近邻算法) 是一种简单且常用的分类和回归算法。它属于监督学习算法,基于实例的学习方法。KNN 的核心思想是:给定一个样本,找到训练集中与该样本最接近的 K 个样本,然后根据这 K 个样本的标签来预测当前样本的标签。
一、KNN 算法概述
1.1 算法原理
KNN 算法的步骤如下:
1、计算距离:计算待分类样本与训练集中每个样本的距离(通常使用欧氏距离、曼哈顿距离等)。
2、选择 K 个最近邻:根据距离排序,选择距离最近的 K 个样本。
3、投票或平均:
- 如果是分类问题,统计 K 个样本中每个类别的数量,选择数量最多的类别作为预测结果。
- 如果是回归问题,计算 K 个样本的平均值作为预测结果。
4、输出结果:返回预测的类别或值。
1.2 KNN 的优缺点
优点:
- 简单易懂,易于实现。
- 无需训练过程,直接基于数据计算。
- 适用于多分类问题。
缺点:
- 计算复杂度高,尤其是当数据集很大时。
- 对噪声数据和异常值敏感。
- 需要选择合适的 K 值(K 值过小容易过拟合,K 值过大会导致欠拟合)。
1.3 K 值的选择
K 值的选择对 KNN 的性能有很大影响。
通常通过 交叉验证(Cross-Validation)
来选择最优的 K 值。
较小的 K 值对噪声敏感,较大的 K 值会平滑决策边界。
二、Python 实现 KNN 案例
2.1 使用 KNN 算法进行手写数字识别
import numpy as np
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
# 加载手写数字数据集
digits = load_digits()
X = digits.data
y = digits.target
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, 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"Accuracy: {accuracy}")
2.2 使用 Python 实现 KNN 分类
1. 导入库
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report
2. 加载数据集
这里使用经典的 Iris 数据集:
# 加载数据集
iris = load_iris()
X = iris.data # 特征
y = iris.target # 标签
3. 数据预处理
将数据集分为训练集和测试集,并进行标准化:
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 标准化特征
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
4. 训练 KNN 模型
使用 KNeighborsClassifier 训练模型:
# 创建 KNN 模型
knn = KNeighborsClassifier(n_neighbors=3) # 选择 K=3
# 训练模型
knn.fit(X_train, y_train)
5. 预测与评估
使用测试集进行预测,并评估模型性能:
# 预测
y_pred = knn.predict(X_test)
# 评估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Classification Report:\n", classification_report(y_test, y_pred))
6. 完整代码
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report
# 加载数据集
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)
# 标准化特征
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 创建 KNN 模型
knn = KNeighborsClassifier(n_neighbors=3)
# 训练模型
knn.fit(X_train, y_train)
# 预测
y_pred = knn.predict(X_test)
# 评估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Classification Report:\n", classification_report(y_test, y_pred))
7. 运行结果
运行上述代码后,你会看到类似以下的输出:
Accuracy: 1.0
Classification Report:
precision recall f1-score support
0 1.00 1.00 1.00 16
1 1.00 1.00 1.00 14
2 1.00 1.00 1.00 15
accuracy 1.00 45
macro avg 1.00 1.00 1.00 45
weighted avg 1.00 1.00 1.00 45
三、总结
KNN算法作为一种简单而有效的分类和回归方法,在许多实际问题中都有广泛的应用。其核心思想是通过测量数据点之间的距离来进行预测,具有易理解、无需训练过程等优点。然而,KNN也存在计算量大、对特征缩放敏感等缺点。在实际应用中,合理选择K值、进行特征预处理以及利用高效的实现库(如Scikit-learn)可以充分发挥KNN的优势。