机器学习-手写数字识别系统

需要两个数据包,里边有许多数字图像,像这样:

机器学习-手写数字识别系统_第1张图片

数据包

import numpy as np
import operator
from os import listdir

"""分类函数"""
def classfy0(inX, dataSet, labels, k):  # 参数分别为测试样本,训练样本,训练样本标签,近邻个数
    dataSetSize = dataSet.shape[0]  # 返回行列数,0为行,列为1
    diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet  # tile是按照某个方向复制元素,行方向复制四行,列方向复制一行,然后减去每个训练样本值
    sqDiffMat = diffMat ** 2  # 乘方运算
    sqDistances = sqDiffMat.sum(axis=1)  # 轴为1的方向(横向)求和
    distances = sqDistances ** 0.5  # 乘方运算,等同于开根号
    sortedDistIndicies = distances.argsort()  # 返回从小到大排序的索引值(原数组不动)
    classCount = {}  # 字典(键值对)
    for i in range(k):  # for-each循环,统计前k个每个分类有多少个
        voteIlabel = labels[sortedDistIndicies[i]]  # 记录每个的标签
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1  # 取出该标签的值+1(原先没有默认为0)
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1),
                              reverse=True)  # operator.itemgetter(1)表示用键值对中的值排序,为0表示用键排序,一开始升序,reverse=True后降序
    return sortedClassCount[0][0]  # 返回第一个标签


"""32*32矩阵->1*1024矩阵"""
def imgVector(filename):
    returnVect = np.zeros((1, 1024))  # 创建1*1024矩阵,用0填充
    fr = open(filename)  # 打开文件
    for i in range(32):
        lineStr = fr.readline()  # 按行读取
        for j in range(32):
            returnVect[0, 32 * i + j] = int(lineStr[j])  # 每一行的32个元素依次添加到1*1024的矩阵中
    return returnVect


"""处理文件"""
def handwritingClassTest():
    hwLabels = []  # 测试机标签
    trainingFileList = listdir('trainingDigits')  # 返回trainingDigits目录下的文件名,如:0_0.txt
    m = len(trainingFileList)  # 求文件名个数
    trainingMat = np.zeros((m, 1024))  # 因为每个文件都对应一个1*1024的矩阵,所以创建一个m*1024的矩阵
    for i in range(m):
        fileNameStr = trainingFileList[i]  # 依次取每一个文件名字
        fileStr = fileNameStr.split('.')[0]  # 以原点分开,并且取前边的(去掉后缀)如:0_0
        classNumStr = int(fileStr.split('_')[0])  # 获得文件名字前边的数字,如:0
        hwLabels.append(classNumStr)  # 将数字添加到标签数组
        trainingMat[i, :] = imgVector('trainingDigits/%s' % fileNameStr)  # 将每一个文件转换成1*1024的矩阵
    testFileList = listdir('testDigits')  # 返回testFileList目录下的文件名,如:0_0.txt
    errorCount = 0.0
    mTest = len(testFileList)  # 测试文件数
    for i in range(mTest):
        fileNameStr = testFileList[i]
        fileStr = fileNameStr.split('.')[0]
        classNumStr = int(fileStr.split('_')[0])
        vectorUnderTest = imgVector('testDigits/%s' % fileNameStr)  # 取每一个文件的1*1024矩阵
        classifierResult = classfy0(vectorUnderTest, trainingMat, hwLabels, 3)  # 进行分类
        print("the classifier came back with:%s,the real answer is:%s" % (classifierResult, classNumStr))
        if (classifierResult != classNumStr):
            errorCount += 1.0
    print("\nthe total number of errors is:%f" % errorCount)
    print("\nthe total error rate is:%f%%" % (errorCount / float(mTest)))


if __name__ == '__main__':
    handwritingClassTest()

机器学习-手写数字识别系统_第2张图片

你可能感兴趣的:(机器学习,python,机器学习,k近邻算法,数字识别系统)