KNN(K-Nearest Neighbors,K 最近邻)是一种基本的分类和回归算法,它的工作原理非常直观:通过测量不同特征值之间的距离来进行预测。
工作原理
KNN 算法的核心思想是,一个样本的类别可以由它的 "K" 个最近邻居(K 是一个正整数)的类别来决定。具体步骤如下:
确定 K 值:选择一个正整数 K,它决定了评估新数据点时将考虑多少个最近的邻居。
计算距离:计算待分类点与其他所有点之间的距离。常用的距离计算方法包括欧氏距离(Euclidean distance)、曼哈顿距离(Manhattan distance)和闵可夫斯基距离(Minkowski distance)等。
找到最近的 K 个邻居:根据计算得到的距离,选择距离最近的 K 个点作为邻居。
进行决策:
- 在分类问题中,可以通过对 K 个邻居的类别进行投票来确定新数据点的类别,即得票最多的类别将被赋予给新数据点。
- 在回归问题中,可以通过计算 K 个邻居的值的平均值来预测新数据点的值。
KNN 的特点
- 简单易懂:KNN 是一种非常简单的算法,易于理解和实现。
- 无需训练:KNN 是一种惰性学习算法,它不需要在训练阶段构建模型,所有的计算都是在预测阶段进行的。
- 可用于非线性问题:KNN 不需要假设数据的分布,因此可以用于非线性问题的分类和回归。
- 敏感性:KNN 对数据规模、噪声和不相关特征比较敏感,这可能会影响其性能。
KNN 的缺点
- 计算成本高:由于在预测时需要计算待分类点与所有训练数据点之间的距离,因此当数据集很大时,计算成本会很高。
- 存储成本高:KNN 需要存储全部数据集,因此存储成本较高。
- 对不平衡数据敏感:KNN 对类别不平衡的数据集比较敏感,可能会导致预测偏差。
- 需要选择合适的 K 值:K 值的选择会对算法的性能产生重要影响,需要通过交叉验证等方法来选择最优的 K 值。
KNN 的应用
KNN 可以应用于多种场景,包括但不限于:
- 图像识别
- 推荐系统
- 医疗诊断
- 模式识别
实现 KNN
在 Python 中,可以使用 scikit-learn 库来轻松实现 KNN 分类器:
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import 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.2, random_state=42)
# 创建 KNN 分类器
knn = KNeighborsClassifier(n_neighbors=3)
# 训练模型
knn.fit(X_train, y_train)
# 预测
y_pred = knn.predict(X_test)
# 评估模型
print(classification_report(y_test, y_pred))