文章大纲
加载中...

K近邻算法(KNN)

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

一、理论知识

什么是K近邻算法?

K近邻算法(K-Nearest Neighbors, KNN)是一种简单而强大的分类和回归算法。它的基本思想是:物以类聚,人以群分。也就是说,相似的事物通常具有相似的特征和属性。

KNN的工作原理

  1. 存储:记住所有训练数据点及其标签

  2. 距离计算:计算新数据点与所有训练数据点之间的距离

  3. 排序:按距离排序,找出最近的K个邻居

  4. 投票决策

    • 分类问题:采用多数表决法
    • 回归问题:取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算法会:

  1. 计算[3, 1]与所有训练点的距离
  2. 找出最近的2个邻居
  3. 这些邻居投票决定新点的类别

三、预测过程详解

让我们手动计算一下预测过程:

  1. 计算[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个邻居:

    • [2, 0],距离约为1.41,标签为1
    • [1, 0],距离约为2.24,标签为1
  3. 投票决策:

    • 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

近朱者赤近墨者黑,物以类聚,人以群分。