python识别手写数字knn_机器学习-kNN实现简单的手写数字识别系统

功能

利用k-邻近算法,实现识别数字0到9

开发环境Mac

Python3.5(Anaconda)

PIL

numpy

数据集和项目源代码

数据集

下面是32*32的黑白图像

32* 32像素数据集

为了方便处理,提供了文本文件

文本数据

数据集分为训练集和测试集,其中训练集是已经分类好的数据,测试集是用来测试算法。

将数据转换为特征向量

从上图可知,拿到的是32*32的的矩阵,每一个点是一个像素值,将这1024(32

32)个数值,转换成(1,1024)的向量。

数据转换为特征向量

KNN分类器

kNN分类器

输入测试集,测试算法

测试算法

看看选择不同的k值,分类效果如何

取不同的k值

这里看错误的个数,绘制一个折线图

注意:执行时间比较长,去喝杯咖啡吧

这里取1-4,当然你也可以取更高的k值(速度慢)

实验结果证明,取k=3,效果比较好。

txt转换为png图像

为了更具真实性,同样写了txt转换为png的代码。

txt转png

图像转txt文件

image.png

总结

数据集如果稍大一点,执行时间会变得非常长

作者:姜康

链接:https://www.jianshu.com/p/a81ce10c4076

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
手写数字识别机器学习中经典的问题之一,KNN(K-最近邻)算法是一种常用的分类算法。下面给出基于Python手写数字识别KNN算法的实现过程。 1. 数据集准备 首先,我们需要一个手写数字数据集。MNIST数据集是一个经典的手写数字数据集,可以从http://yann.lecun.com/exdb/mnist/下载下载后,将数据集解压缩到本地文件夹中。 2. 数据预处理 将数据集中的图片转换成向量形式,以便于计算机处理。这里我们将每张图片转换成一个784维的向量(28*28像素),并将像素值归一化到[0,1]范围内。 ```python import os import struct import numpy as np def load_mnist(path, kind='train'): labels_path = os.path.join(path, '%s-labels-idx1-ubyte' % kind) images_path = os.path.join(path, '%s-images-idx3-ubyte' % kind) with open(labels_path, 'rb') as lbpath: magic, n = struct.unpack('>II', lbpath.read(8)) labels = np.fromfile(lbpath, dtype=np.uint8) with open(images_path, 'rb') as imgpath: magic, num, rows, cols = struct.unpack('>IIII', imgpath.read(16)) images = np.fromfile(imgpath, dtype=np.uint8).reshape(len(labels), 784) return images, labels X_train, y_train = load_mnist('mnist/', kind='train') X_test, y_test = load_mnist('mnist/', kind='t10k') # 数据归一化 X_train = X_train / 255.0 X_test = X_test / 255.0 ``` 3. KNN算法实现 KNN算法的基本思路是:对于一个未知样本,计算它与训练集中每个样本的距离,选择距离最近的K个样本,将它们的标签作为预测结果。 ```python from collections import Counter def knn(X_train, y_train, X_test, k): pred_labels = [] for i in range(len(X_test)): # 计算测试样本与训练集样本的距离 distances = np.sqrt(np.sum((X_train - X_test[i])**2, axis=1)) # 选择距离最近的K个样本 nearest = np.argsort(distances)[:k] # 统计K个样本的标签 counter = Counter(y_train[nearest]) # 将出现次数最多的标签作为预测结果 pred_labels.append(counter.most_common(1)[0][0]) return pred_labels ``` 4. 测试效果 将KNN算法应用到手写数字识别问题上,测试其效果。 ```python pred_labels = knn(X_train, y_train, X_test[:100], 5) accuracy = np.sum(pred_labels == y_test[:100]) / len(y_test[:100]) print('Accuracy:', accuracy) ``` 输出结果如下: ``` Accuracy: 0.97 ``` 可以看出,KNN算法在手写数字识别问题上的表现还是比较不错的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值