《机器学习实战》笔记(四) 示例2

手写识别系统(仅0-9)

 

此系统仅能识别0-9,需识别的数字已经使用图像处理软件处理成具有相同色彩和大小:32*32像素的黑白图像,将图像转换为了文本格式。

 

步骤:

1)收集数据:文本文件

2)准备数据:函数img2vector() 将图像格式转换为分类器使用的向量格式

3)分析数据:在python命令符中检查数据,确保它符合要求

4)训练算法:KNN中不适用

5)测试算法:编写函数使用提供的部分数据集作为测试样本,测试样本与非测试样本的区别在于测试样本是已经完成分类的数据,如预测分类与实际类别不同,则标记为一个错误

6)使用算法:文中没有完成。可从图像中提取数字,并完成数字识别。

扫描二维码关注公众号,回复: 5462215 查看本文章

 

KNN算法(和之前的一样)

函数:classify0()

 

一、准备数据、

训练数据:trainningDigits  每个数字大概200种

测试数据:testDigits           900个

1. 将图像格式化处理为一个向量

32×32 → 1×1024

创建1×1024的NumPy数组,然后打开给定的文件,循环读出文件的前32行,并将每行的头32个字符存储在NumPy数组中,最后返回数组

函数:img2vector

def img2vector(filename):
    returnVect = zeros((1,1024))    # 构造1×1024的矩阵
    fr = open(filename)
    for i in range(32):             # 每一行
        lineStr = fr.readline()
        for j in range(32):         # 每行依次写入returnVect中
            returnVect[0,32*i+j] = int(lineStr[j])
    return returnVect

 

二、测试算法

函数:hwClassTest

不用归一化 所以直接从准备数据→(分析数据→)测试数据

def hwClassTest():
    hwLables = []
    trainingFileList = os.listdir('trainingDigits')        # 制定训练文件夹
    m = len(trainingFileList)
    trainingMat = zeros([m,1024])
    for i in range(m):                                   # 对每一个文件
        fileNameStr = trainingFileList[i]
        fileStr = fileNameStr.split('.')[0]
        classNumStr = int(fileNameStr.split('_')[0])     # 从文件名解析分类数字
        hwLables.append(classNumStr)
        trainingMat[i,:] = img2vector('./trainingDigits/%s'%fileNameStr)
    testFileList = os.listdir('testDigits')
    errorCount = 0.0
    mTest = len(testFileList)
    for i in range(mTest):
        fileNameStr = testFileList[i]
        fileStr = fileNameStr.split('.')[0]
        classNumStr = int(fileNameStr.split('_')[0])  # 从文件名解析分类数字
        vectorUnderTest = img2vector('testDigits/%s'%fileNameStr)
        classifierResult = classify0(vectorUnderTest,trainingMat,hwLables,3)
        print("the classifer came back with:%d, the real answer is:%d" % (classifierResult,classNumStr))
        if(classifierResult != classNumStr):
            errorCount += 1
    print("\nthe total number of errors is : %d" % errorCount)
    print("\nthe total error rate is : %f" % (errorCount/float(mTest)))

算法的执行效率并不高,存储空间和计算时间开销大。k决策树是k-近邻算法的优化版

knn必须保存全部数据集,如果训练数据集很大,要占用大量的存储空间。并且需要对数据集中的每个数据计算距离,实际使用可能十分耗时。

 

第一章总结 KNN

1. 核心算法KNN

①计算距离

②距离排序(小→大)

③取前k个 统计标签

④标签排序(大→小)

⑤返回标签最大的值

 

2. 数据处理函数

①将数据特征处理为向量

②处理标签列表

 

3. 归一化函数

①最大值

②最小值

③值-最小值/(最大值-最小值)

 

4. 测试函数

5. 使用函数

※输入的数据也需要进行归一化

猜你喜欢

转载自blog.csdn.net/qq_22527013/article/details/81240514