其他实现手写数字识别的方法:
1.KNN实现手写数字识别
2. 卷积神经网络(CNN)实现手写数字识别
3. 全连接神经网络实现手写数字识别
4. 聚类(K-means)实现手写数字识别-2
-
实验数据是老师收集了所有人的手写数字图片,且经过处理将图像生成了.txt文件,如何生成点击这,如下图
-
代码实现
代码修改自sklearn官方给出的代码,在读取数据时发生了改变,增加了几个函数,因为用的是自己的数据,而且sklearn是自带很多数据集的
import numpy as np
from sklearn.cluster import KMeans
from sklearn import metrics
from os import listdir
# 因为你的数据是自己的数据,所以才会有前三个方法:img2vector(), getLabel(),
# getData()用来获取数据,数据标签和处理数据。如果你用的是mnist数据集
# 或者是sklearn中自带的数据集,则直接加载即可
"""
函数说明:将32x32的二进制图像转换为1x1024向量
"""
def img2vector(filename):
# 创建1x1024零向量
returnVect = np.zeros((1, 1024))
# 打开文件
fr = open(filename)
# 按行读取
for i in range(32):
# 读一行数据
lineStr = fr.readline()
# 每一行的前32个元素依次添加到returnVect中
for j in range(32):
returnVect[0, 32 * i + j] = float(lineStr[j])
# 返回转换后的1x1024向量
return returnVect
'''
函数说明:获取标签
'''
def getLabel(Datapath):
# 训练集的Labels
hwLabels = []
# 返回Datapath目录下的文件名
trainingFileList = listdir(Datapath)
# 返回文件夹下文件的个数
m = len(trainingFileList)
# 从文件名中解析出训练集的类别
for i in range(m):
# 获得文件的名字
fileNameStr = trainingFileList[i]
# 获得分类的数字
classNumber = int(fileNameStr.split('_')[0])
# 将获得的类别添加到hwLabels中
hwLabels.append(classNumber)
return hwLabels
'''
函数说明:获取数据
'''
def getData(Datapath):
# 返回train目录下的文件名
trainingFileList = listdir(Datapath)
# 返回文件夹下文件的个数
m = len(trainingFileList)
# 初始化训练的Mat矩阵,训练集
trainingMat = np.zeros((m, 1024))
for i in range(m):
# 获得文件的名字
fileNameStr = trainingFileList[i]
# 将每一个文件的1x1024数据存储到trainingMat矩阵中
trainingMat[i, :] = img2vector(Datapath+'/%s' % (fileNameStr))
return trainingMat
# -------------load data
# 加载数据
train_images = getData('train')
test_images = getData('testless')
train_labels = getLabel('train')
test_labels = getLabel('testless')
# -------------training
# initialize,and set cluster nums
kmeans = KMeans(n_clusters=10)
kmeans.fit(train_images)
y_pred = kmeans.predict(test_images)
# -------------performance measure by ARI(Adjusted Rand Index)
print(metrics.adjusted_rand_score(test_labels, y_pred))
- 还有一个K-means实现手写数字识别的代码,我过段时间再分享