KNN算法如何处理多类别问题?
KNN(K-Nearest Neighbors)算法是一种常用的监督学习算法,用于处理分类和回归问题。在本文中,我们将详细介绍KNN算法如何处理多类别问题,并提供相应的原理、公式推导、计算步骤以及Python代码示例。
算法原理
KNN算法基于实例的学习,它采用邻近样本的投票方式对新的样本进行分类。对于分类问题,KNN算法的原理可以简述为以下几个步骤:
-
计算样本之间的距离:KNN算法首先计算待分类样本与训练集中每个样本之间的距离。常用的距离度量方法包括欧氏距离、曼哈顿距离等。
-
选择最近的K个邻居:根据距离,选择与待分类样本最近的K个样本作为候选邻居。
-
进行投票决策:根据候选邻居的类别,进行投票决策。通常采用多数表决的方式,将待分类样本归为票数最多的类别。
公式推导
假设训练数据集包含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_test
与X_train
中每个样本之间的距离,并将距离和对应的类别标签存储在distances
列表中。
然后,我们按照距离的升序对distances
列表进行排序,并选择前K个邻居。
最后,我们使用numpy
库中的bincount
函数对邻居的类别进行统计,并选择票数最多的类别作为预测结果。
在本示例中,待分类样本X_test
被预测为类别A。
代码细节解释
在代码示例中,我们使用numpy
库来实现向量运算,以提高代码的运行效率。
numpy
的array
数据结构被用来表示训练集X_train
和待分类样本X_test
。
我们通过使用向量化的方式计算距离,并使用列表生成式来提取邻居的类别,并使用numpy
的bincount
函数来统计类别出现的次数。
最后,我们使用numpy
的argmax
函数来选择票数最多的类别作为预测结果。
此外,我们还可以使用matplotlib
库来绘制数据集的分布图,以帮助我们更好地理解KNN分类的过程。
通过本文的介绍,我们详细解决了关于KNN算法如何处理多类别问题的提问,并提供了相应的算法原理、公式推导、计算步骤以及Python代码示例。希望本文能帮助到对KNN算法感兴趣的读者。
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/829152/
转载文章受原作者版权保护。转载请注明原作者出处!