python手写数字识别knn算法不使用sklearn
时间: 2023-07-28 10:49:08 浏览: 98
好的,我可以帮你回答这个问题。KNN 算法是一种简单的机器学习算法,可以用于分类和回归问题。下面是手写数字识别的 KNN 算法的 Python 实现:
首先,我们需要导入必要的 Python 库:
```python
import numpy as np
import matplotlib.pyplot as plt
```
接下来,我们需要定义一个函数来计算两个向量之间的欧几里得距离:
```python
def euclidean_distance(x1, x2):
return np.sqrt(np.sum((x1 - x2)**2))
```
然后,我们需要定义一个 KNN 分类器类:
```python
class KNN:
def __init__(self, k=3):
self.k = k
def fit(self, X, y):
self.X_train = X
self.y_train = y
def predict(self, X):
y_pred = [self._predict(x) for x in X]
return np.array(y_pred)
def _predict(self, x):
distances = [euclidean_distance(x, x_train) for x_train in self.X_train]
k_indices = np.argsort(distances)[:self.k]
k_nearest_labels = [self.y_train[i] for i in k_indices]
most_common = Counter(k_nearest_labels).most_common(1)
return most_common[0][0]
```
在这个 KNN 类中,我们有三个方法:
- `__init__`:初始化 KNN 分类器,指定 K 的值。
- `fit`:将训练数据和标签保存到分类器中,以便后续预测使用。
- `predict`:对测试数据进行预测。
- `_predict`:对单个测试数据进行预测。
最后,我们可以使用 MNIST 数据集进行测试:
```python
from mnist import MNIST
mndata = MNIST('./mnist/')
X_train, y_train = map(np.array, mndata.load_training())
X_test, y_test = map(np.array, mndata.load_testing())
knn = KNN(k=3)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
accuracy = np.sum(y_pred == y_test) / len(y_test)
print("Accuracy:", accuracy)
```
这个步骤可能需要一些时间来运行,因为 MNIST 数据集中有很多图像。最后,我们可以得出预测的准确性。
阅读全文