• 大小: 681KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-13
  • 语言: Python
  • 标签: KNN  

资源简介

python实现K进邻算法对手写数字识别的一个小Demo,含代码和数据集。适合刚入门的小白。棒棒棒棒棒棒棒棒棒棒棒棒

资源截图

代码片段和文件信息

# encoding:utf-8
import numpy as np
import os
import operator

# 训练数据集文件路径
Dir = ‘C:\Users\zqwke\Desktop\dataset\digits\\trainingDigits\\‘
# 测试数据集文件路径
Dir_test = ‘C:\Users\zqwke\Desktop\dataset\digits\\testDigits\\‘

‘‘‘
算法思路:
1、首先将(32x32)的数据矩阵转化为(1x1024)的格式。
然后把训练数据集最后转化为(Mx1024)的一个矩阵形式,记为A,每一行是一个手写数字
2、同样把要测试的单个手写数字转化为(1x1024)格式,然后重复训练样本个数的次数,得到(Mx1024)的格式,记为B,每一行都一样,M为训练样本总数
3、计算A与B之间的距离,得到单个手写数字与所有训练集的距离
4、对距离数组排序,得到距离最近的K个点
5、在K个点中出现频率最高的数字记为最后分类结果

‘‘‘

# 原数据矩阵转化方法,由 [32 32] → [1 1024]
def ImageVector(Dir filename):
    # 创建一个1x1024的零矩阵
    ImageVec = np.zeros(1024)
    fr = open(Dir + filename)
    # 将原数据储存进零矩阵
    for i in range(32):
        line = fr.readline()
        for j in range(32):
            ImageVec[32*i+j] = int(line[j])
    return ImageVec

# 数据载入
def LoadData(Dir):
    List = os.listdir(Dir)  # 得到Dir路径下的所有文件目录
    NumTraining = len(List)  # 计算共用多少个文件
    TrainingSet = np.zeros((NumTraining 1024))  # 构建一个Mx1024的矩阵 , M即为文件个数
    Labels = np.zeros(NumTraining)  # 标签矩阵
    # 将训练集储存到一个训练矩阵
    for i in range(NumTraining):
        FileName = List[i]
        int_x = ImageVector(Dir FileName)
        for j in range(1024):
            TrainingSet[i][j] = int_x[j]
        Labels[i] = List[i][0]  # 得到每个手写数据的对应标签数组
    return TrainingSet Labels

# 计算距离,此处省略对差作平方,这一步放在Classify中,距离公式等于distance = (∑(trainingSet - 输入)**2)**0.5
def DisCompute(Array):
    Distance = 0
    for i in range(len(Array)):
        Distance += Array[i]
    return Distance**0.5

#  KNN分类
def Classify(input DataSet Label k):
    DataSize = DataSet.shape[0]
    diffMat = np.tile(input (DataSize 1)) - DataSet
    sqDiffMat = diffMat ** 2
    Distance_squence = np.zeros(len(sqDiffMat))  # 距离序列
    for i in range(len(sqDiffMat)):
        distances = DisCompute(sqDiffMat[i])
        Distance_squence[i] = distances
    sortedDistance = Distance_squence.argsort()  # 将距离按升序排列,argsort得到的是升序排序的索引值,而不是距离
    classcount = {}  # K近邻字典
    #  把距离最近的前K个点的标签存进字典,Key为标签。value为出现频数
    for i in range(k):
        voteLabel = Label[sortedDistance[i]]
        classcount[voteLabel] = classcount.get(voteLabel 0) + 1
    #  得到排序后的字典,按value值排序,最终返回出现次数最高的类标签,即为分类结果
    sortedClassCount = sorted(classcount.iteritems() key=operator.itemgetter(1) reverse=True)
    return sortedClassCount[0][0]


def handWritingTest():
    print ‘......Loading Training Date......‘
    trainingset Label_x = LoadData(Dir)
    print ‘......Loading Testing Date.......‘
    testingset Label_y = LoadData(Dir_test)
    testing_num = len(testingset)
    count = 0
    print ‘......Testing......‘
    #  开始测试,识别正确输出Right和对应序号,识别错误输出False和对应序号
    for i in range(testing_num):
        output = Classify(testingset[i] trainingset Label_x 5)
        if output == Label_y[i]:
            print ‘Right %d‘ % i
            count += 1
        else:
            print ‘False %d‘ % i
    TheRightRate = float(count)/testing_num
  

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        1088  2010-10-07 21:35  digits\testDigits\0_0.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_1.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_10.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_11.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_12.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_13.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_14.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_15.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_16.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_17.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_18.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_19.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_2.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_20.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_21.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_22.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_23.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_24.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_25.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_26.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_27.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_28.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_29.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_3.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_30.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_31.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_32.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_33.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_34.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_35.txt
     文件        1088  2010-10-07 21:35  digits\testDigits\0_36.txt
............此处省略2850个文件信息

评论

共有 条评论