根据给出的代码和问题,我们可以使用MNIST数据集构建KNN分类器,并找到最佳的K值。然后,我们可以计算KNN在测试集上的准确率,并绘制混淆矩阵。
首先,我们需要导入所需的库:
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, confusion_matrix
import matplotlib.pyplot as plt
接下来,我们需要加载MNIST数据集:
import mnist_reader
X_train, y_train = mnist_reader.load_mnist(".")
X_test, y_test = mnist_reader.load_mnist(".", kind="t10k")
然后,我们可以定义一个函数来计算并返回KNN在给定K值下的准确率和混淆矩阵:
def knn_accuracy(k):
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
confusion_mat = confusion_matrix(y_test, y_pred)
return accuracy, confusion_mat
接下来,我们可以尝试不同的K值,并选择具有最高准确率的K值:
k_values = [1, 3, 5, 7] # 可以根据实际情况进行调整
best_accuracy = 0.0
best_k = None
for k in k_values:
accuracy, _ = knn_accuracy(k)
if accuracy > best_accuracy:
best_accuracy = accuracy
best_k = k
print("Best K value:", best_k)
然后,我们可以使用找到的最佳K值来计算准确率和混淆矩阵:
best_accuracy, confusion_mat = knn_accuracy(best_k)
print("Accuracy with best K:", best_accuracy)
print("Confusion Matrix:\n", confusion_mat)
# 绘制混淆矩阵
plt.imshow(confusion_mat, cmap='Blues')
plt.colorbar()
plt.xlabel('Predicted Label')
plt.ylabel('True Label')
plt.show()
关于weights
参数,当设置为’distance’时,KNN会根据样本之间的距离赋予不同权重。这意味着更近的邻居对分类的贡献更大。这种方式在处理非线性可分问题时可能效果更好,因为它能够更好地捕捉样本之间的细微差异。然而,在一些简单线性可分问题中,使用标准的KNN(即将weights
参数设置为’uniform’)可能表现得更好。
希望这个代码示例能够帮助你构建一个基于MNIST数据集的KNN分类器,并理解distance权重与标准KNN之间的区别。
内容由零声教学AI助手提供,问题来源于学员提问