K近邻算法(KNN)
3/18/2025
78 阅读

一、理论知识
什么是K近邻算法?
K近邻算法(K-Nearest Neighbors, KNN)是一种简单而强大的分类和回归算法。它的基本思想是:物以类聚,人以群分。也就是说,相似的事物通常具有相似的特征和属性。
KNN的工作原理
-
存储:记住所有训练数据点及其标签
-
距离计算:计算新数据点与所有训练数据点之间的距离
-
排序:按距离排序,找出最近的K个邻居
-
投票决策:
- 分类问题:采用多数表决法
- 回归问题:取K个邻居的平均值或加权平均值
距离计算方法
KNN算法中常用的距离计算方法有:
- 欧氏距离:直线距离,最常用
- 曼哈顿距离:沿坐标轴的距离总和
- 闵可夫斯基距离:欧氏距离和曼哈顿距离的一般化形式
K值的选择
K值的选择非常重要:
- K值太小:容易受噪声影响
- K值太大:可能会包含太多不同类别的点
- 一般选择奇数K值:避免平票情况
- 常见做法:通过交叉验证选择最优K值
二、KNN应用实例
下面我们通过一个实例来演示KNN模型的应用
1. 导入KNN分类器
from sklearn.neighbors import KNeighborsClassifier
这行代码从scikit-learn库中导入KNN分类器类。
2. 准备数据
x = [[1, 0], [2, 0], [0, 1], [0, 2]]
y = [1, 1, 0, 0]
这里我们准备了训练数据:
x
是特征矩阵,包含4个样本,每个样本有2个特征(x1和x2)y
是标签向量,包含4个值,对应每个样本的类别(0或1)
从数据可以看出,当x1大于x2时,类别为1;当x1小于x2时,类别为0。
但是这只是我们的猜测,接下来我们利用KNN分类器从这些数据中学习规律。
3. 创建KNN分类器
estimator = KNeighborsClassifier(n_neighbors=2)
这行代码创建了一个KNN分类器,参数n_neighbors=2
表示我们选择最近的2个邻居来进行投票决策。
4. 训练模型
estimator.fit(x, y)
对于KNN这种懒惰学习算法,训练过程实际上只是存储训练数据。真正的计算发生在预测阶段。
5. 预测新数据点
ret = estimator.predict([[3, 1]])
print("当x1=3, x2=1时,预测的类别为:", ret)
这里我们预测新数据点[3, 1]的类别。KNN算法会:
- 计算[3, 1]与所有训练点的距离
- 找出最近的2个邻居
- 这些邻居投票决定新点的类别
三、预测过程详解
让我们手动计算一下预测过程:
-
计算[3, 1]与所有训练点的欧氏距离:
- 与[1, 0]的距离:√((3-1)² + (1-0)²) = √(4 + 1) = √5 ≈ 2.24
- 与[2, 0]的距离:√((3-2)² + (1-0)²) = √(1 + 1) = √2 ≈ 1.41
- 与[0, 1]的距离:√((3-0)² + (1-1)²) = √(9 + 0) = 3
- 与[0, 2]的距离:√((3-0)² + (1-2)²) = √(9 + 1) = √10 ≈ 3.16
-
找出最近的2个邻居:
- [2, 0],距离约为1.41,标签为1
- [1, 0],距离约为2.24,标签为1
-
投票决策:
- 2个最近邻居的标签都是1
- 因此预测[3, 1]的类别为1
这与我们的直觉相符:新点[3, 1]的x1(3)大于x2(1),应该属于类别1。
四、小结
KNN算法是一种简单而有效的分类和回归算法,它基于"相似的事物具有相似属性"的假设。在本例中,我们使用KNN成功预测了新数据点的类别。
KNN的优点:
- 简单易懂,容易实现
- 无需训练,适合动态数据
- 对异常值不敏感
KNN的缺点:
- 计算复杂度高,预测速度慢
- 需要大量内存存储训练数据
- 对特征缩放敏感
五、完整代码
# 导入KNN分类器
from sklearn.neighbors import KNeighborsClassifier
# 获取数据x,y
# x是特征数据,每行代表一个样本,每个样本有两个特征(x1和x2)
x = [[1, 0], [2, 0], [0, 1], [0, 2]]
# y是标签数据,对应每个样本的类别
y = [1, 1, 0, 0]
# 实例化一个KNN分类器
# n_neighbors=2表示选择最近的2个邻居进行投票
estimator = KNeighborsClassifier(n_neighbors=2)
# 调用fit方法进行训练
# 这一步实际上只是存储了训练数据,KNN是懒惰学习算法
estimator.fit(x, y)
# 预测新数据点[3,1]的类别
ret = estimator.predict([[3, 1]])
print("当x1=3, x2=1时,预测的类别为:", ret)
通过这个例子,我们可以看到KNN算法的简单性和有效性。它不需要复杂的训练过程,只需要存储训练数据,然后在预测时找出最近的邻居进行投票决策。
评论 (1)
616559958@qq.com 3/19/2025, 7:27:02 PM
近朱者赤近墨者黑,物以类聚,人以群分。