KNN算法

算法介绍

KNN(K- Nearest Neighbor)法即K最邻近法,最初由 Cover和Hart于1968年提出,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路非常简单直观:如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

该方法的不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最邻近点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。另外还有一种 Reverse KNN法,它能降低KNN算法的计算复杂度,提高分类的效率。

KNN算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。

核心算法

KNN算法的核心思想是,如果一个样本在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。KNN方法在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。

算法流程

总体来说,KNN分类算法包括以下4个步骤:
1.准备数据,对数据进行预处理。
2.计算测试样本点(也就是待分类点)到其他每个样本点的距离。
3.对每个距离进行排序,然后选择出距离最小的K个点。
4.对K个点所属的类别进行比较,根据少数服从多数的原则,将测试样本点归入在K个点中占比最高的那一类。

实例尝试

鸢尾花分类

lris数据集

鸢尾花(Iris)数据集包含在scikit-learn的datasets模块中,我们可以调用load_iris函数来加载数据集:

from sklearn.datasets import load_iris
iris_dataset = load_iris()

数据导入并分类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import sklearn.datasets as datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

iris = datasets.load_iris()

feature = iris['data']
target = iris['target']

x_train, x_test, y_train, y_test = train_test_split(feature, target, test_size=0.2, random_state=2021)

knn = KNeighborsClassifier(n_neighbors=3)
knn = knn.fit(x_train, y_train)
#print(knn)

y_pred = knn.predict(x_test)
y_true = y_test
print('模型的分类结果:', y_pred)
print('真实的分类结果:', y_true)

print(knn.score(x_test, y_test))

image
结果显示准确率达到99.67%

预测尝试

test1 = knn.predict([[6.1, 3.1, 4.7, 2.1]])
print(test1)

image
根据预测,这朵新的鸢尾花属于类别2。
编写代码,查看类别分别代表哪些种类。

print(iris_dataset['target_names'])

image
也就说它属于virginica品种。预测结束。