KNN算法如何处理多类别问题?

KNN算法如何处理多类别问题?

KNN(K-Nearest Neighbors)算法是一种常用的监督学习算法,用于处理分类和回归问题。在本文中,我们将详细介绍KNN算法如何处理多类别问题,并提供相应的原理、公式推导、计算步骤以及Python代码示例。

算法原理

KNN算法基于实例的学习,它采用邻近样本的投票方式对新的样本进行分类。对于分类问题,KNN算法的原理可以简述为以下几个步骤:

  1. 计算样本之间的距离:KNN算法首先计算待分类样本与训练集中每个样本之间的距离。常用的距离度量方法包括欧氏距离、曼哈顿距离等。

  2. 选择最近的K个邻居:根据距离,选择与待分类样本最近的K个样本作为候选邻居。

  3. 进行投票决策:根据候选邻居的类别,进行投票决策。通常采用多数表决的方式,将待分类样本归为票数最多的类别。

公式推导

假设训练数据集包含N个样本,每个样本由输入特征$x_i$和对应的类别标签$y_i$组成。待分类样本为$x$,我们需要预测其类别$y$。 KNN算法使用欧氏距离作为距离度量方法,距离公式如下所示:

$$d(x_i, x) = \sqrt{\sum_{j=1}^{M}(x_{ij} – x_j)^2}$$

其中,$M$表示样本的特征维度。

根据距离公式,我们可以计算待分类样本与训练集中每个样本的距离。接下来,我们选择最近的K个邻居。

计算步骤

为了更好地理解KNN算法如何处理多类别问题,我们将通过一个具体的例子来演示算法的计算步骤。

假设有一个虚拟数据集,包含5个样本,每个样本有两个特征,并且每个样本都属于3个类别之一:A、B、C。我们的目标是预测一个新样本$x=[1.5, 2.0]$的类别。

首先,我们计算新样本与训练集中每个样本之间的距离,根据欧氏距离公式。

样本1:$d(x_1, x) = \sqrt{(2-1.5)^2 + (1-2)^2} = 1.118$

样本2:$d(x_2, x) = \sqrt{(3-1.5)^2 + (1-2)^2} = 1.581$

样本3:$d(x_3, x) = \sqrt{(2-1.5)^2 + (4-2)^2} = 2.236$

样本4:$d(x_4, x) = \sqrt{(4-1.5)^2 + (3-2)^2} = 2.827$

样本5:$d(x_5, x) = \sqrt{(3-1.5)^2 + (4-2)^2} = 2.236$

接下来,我们选择最近的K个邻居。假设选择K=3,我们选择样本1、样本2和样本5作为候选邻居。

最后,我们通过投票决策来预测待分类样本的类别。在这种情况下,样本1和样本5都属于类别A,样本2属于类别B。由于类别A的票数最多,我们将待分类样本$x$预测为类别A。

Python代码示例

下面是使用Python实现KNN算法处理多类别问题的示例代码:

import numpy as np

def knn(X_train, y_train, X_test, K):
    distances = []
    for i in range(len(X_train)):
        distance = np.sqrt(np.sum(np.square(X_train[i] - X_test)))
        distances.append((distance, y_train[i]))
    distances.sort(key=lambda x: x[0])
    neighbors = [distances[i][1] for i in range(K)]
    counts = np.bincount(neighbors)
    prediction = np.argmax(counts)
    return prediction

# 虚拟数据集
X_train = np.array([[1, 1], [3, 1], [2, 4], [4, 3], [3, 4]])
y_train = np.array(['A', 'A', 'B', 'C', 'A'])
X_test = np.array([1.5, 2.0])
K = 3

prediction = knn(X_train, y_train, X_test, K)
print(f"The predicted class for the test sample is: {prediction}")

在这个示例代码中,我们首先定义了一个knn函数,该函数接受训练集X_train和对应的类别标签y_train,待分类样本X_test以及参数K。

接下来,我们计算X_testX_train中每个样本之间的距离,并将距离和对应的类别标签存储在distances列表中。

然后,我们按照距离的升序对distances列表进行排序,并选择前K个邻居。

最后,我们使用numpy库中的bincount函数对邻居的类别进行统计,并选择票数最多的类别作为预测结果。

在本示例中,待分类样本X_test被预测为类别A。

代码细节解释

在代码示例中,我们使用numpy库来实现向量运算,以提高代码的运行效率。

numpyarray数据结构被用来表示训练集X_train和待分类样本X_test

我们通过使用向量化的方式计算距离,并使用列表生成式来提取邻居的类别,并使用numpybincount函数来统计类别出现的次数。

最后,我们使用numpyargmax函数来选择票数最多的类别作为预测结果。

此外,我们还可以使用matplotlib库来绘制数据集的分布图,以帮助我们更好地理解KNN分类的过程。

通过本文的介绍,我们详细解决了关于KNN算法如何处理多类别问题的提问,并提供了相应的算法原理、公式推导、计算步骤以及Python代码示例。希望本文能帮助到对KNN算法感兴趣的读者。

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/829152/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球