利用sklearn.neighbors实现基于KNN的图像分类
K最近邻(K-Nearest Neighbors,简称KNN)是一种常见的机器学习分类算法,它基于一个简单的思想:给定一个新的样本,找出与该样本最近的K个样本,然后根据这K个样本的标签来决定该样本的类别。在这个过程中,KNN通过计算样本之间的距离来进行分类。
在Python中,可以使用scikit-learn库(sklearn)中的neighbors模块来实现KNN算法。下面我们以图像分类为例,使用sklearn.neighbors实现基于KNN的图像分类。
首先,我们需要准备一些图像数据以及它们的标签。假设我们要对手写数字进行分类,可以使用MNIST数据集,它包含了一系列已经标注好的手写数字图像。使用sklearn.datasets模块中的load_digits函数可以方便地加载MNIST数据集。
from sklearn.datasets import load_digits digits = load_digits() images = digits.images labels = digits.target
接下来,我们需要将图像数据转化为一维向量,以便进行计算。可以使用reshape函数将二维图像矩阵转化为一维向量。
n_samples = len(images) X = images.reshape((n_samples, -1))
然后,我们将数据集分割为训练集和测试集。训练集用于训练KNN模型,测试集用于评估模型的性能。可以使用train_test_split函数来进行数据集的分割。
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.2, random_state=0)
接下来,我们可以使用KNeighborsClassifier类来构建KNN模型。可以通过设置n_neighbors参数来调整K的大小。
from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier(n_neighbors=5) knn.fit(X_train, y_train)
然后,我们可以使用训练好的KNN模型对测试集进行预测,并计算模型的准确率。
y_pred = knn.predict(X_test)
accuracy = knn.score(X_test, y_test)
print("Accuracy:", accuracy)
最后,我们可以查看一些分类错误的样本,并可视化它们。
import matplotlib.pyplot as plt
wrong_samples = X_test[y_pred != y_test]
wrong_labels = y_pred[y_pred != y_test]
fig, axes = plt.subplots(nrows=len(wrong_samples), ncols=1, figsize=(2, 2 * len(wrong_samples)))
for i in range(len(wrong_samples)):
axes[i].imshow(wrong_samples[i].reshape(8, 8), cmap=plt.cm.gray_r, interpolation='nearest')
axes[i].set_title("Predicted label: %d" % wrong_labels[i])
plt.tight_layout()
plt.show()
上述代码片段通过KNN算法对手写数字图像进行分类,并计算了模型的准确率。最后,还展示了一些分类错误的样本。
通过使用sklearn.neighbors模块,我们可以方便地实现基于KNN的图像分类。然而,值得注意的是,KNN算法的性能会受到K的选择、距离度量方法以及数据集的影响,需要根据具体的任务和数据特点进行调优。
