python手写数字识别knn算法不使用sklearn
时间: 2023-07-28 13:48:35 浏览: 40
openCV+PYTHON实现的knn算法手写数字识别
4星 · 用户满意度95%
好的,我来回答你的问题。
要手写数字识别knn算法,我们需要以下步骤:
1. 首先需要准备训练集和测试集。我们可以使用MNIST数据集,其中包含许多手写数字的图片和对应的标签。
2. 将每张图片转化为一维向量,并将像素值归一化到0到1之间。
3. 对于测试集中的每个样本,计算其与训练集中所有样本的距离。
4. 找出距离最近的k个训练样本,并统计这k个样本中最多的标签。
5. 将测试集中的每个样本都按照上述方法进行预测,并计算预测准确率。
以下是一个示例代码:
```python
import numpy as np
# 定义距离函数
def distance(x1, x2):
return np.sqrt(np.sum((x1 - x2) ** 2))
# 定义knn算法
def knn(X_train, y_train, X_test, k):
y_pred = []
for i in range(len(X_test)):
# 计算测试样本与所有训练样本的距离
distances = [distance(X_test[i], x) for x in X_train]
# 找出距离最近的k个训练样本
k_idx = np.argsort(distances)[:k]
# 统计k个样本中最多的标签
k_labels = [y_train[idx] for idx in k_idx]
pred_label = max(set(k_labels), key=k_labels.count)
y_pred.append(pred_label)
return y_pred
# 加载MNIST数据集
from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 将图片转化为一维向量并归一化
X_train = X_train.reshape(X_train.shape[0], -1) / 255.0
X_test = X_test.reshape(X_test.shape[0], -1) / 255.0
# 预测测试集并计算准确率
y_pred = knn(X_train, y_train, X_test, 5)
accuracy = np.mean(y_pred == y_test)
print("Accuracy:", accuracy)
```
这是一个简单的knn算法示例,你可以根据自己的需求进行修改和优化。
阅读全文