2021-03-09

KNN手写数字识别
0—9
图片已经处理为32x32 为简约处理需将其转化为1x1024
划分训练集与数据集
代码部分:
先写训练集

def get_train():
   path = 'digit/trainingDigits' #图片的路径
   trainingFileList=os.listdir(path) 把路径化为list形式
   

在这里插入图片描述

train = pd.DataFrame()  空的
img = []  为了后面返回的两列 第一列放图片 就是1024个picture 0,1分别是什么
lables = []  原来的标签
m = len(trainingFileList) 
for i in range(m):
    filename = trainingFileList[i]  提取文件名

在这里插入图片描述

txt = pd.read_csv(f'digits/traainingDigits/{filename}',header =None)  用pd.read_csv 读入文件


在这里插入图片描述
接下来要把32行换成1 行

num = ''
for i in range(txt.shape[0]):
    num += txt.iloc[i,:]
img.append(num[0])  提取出了图像
filelable = filename.split('_')[0]   用文件名提取第0个
labels.append(filelable)  加入标签列
train['img'] = img
train['lables'] = lables
return train

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

得到测试集 和上面是一样的

def get_test():
   path = 'digit/testDigits' #图片的路径
   trainingFileList=os.listdir(path) 把路径化为list形式
   train = pd.DataFrame()  空的
   img = []  为了后面返回的两列 第一列放图片 就是1024个picture 01分别是什么
   lables = []  原来的标签
   m = len(trainingFileList) 
   for i in range(m):
      filename = trainingFileList[i]  提取文件名
      txt = pd.read_csv(f'digits/traainingDigits/{filename}',header =None)  用pd.read_csv 读入文件
      num = ''
      for i in range(txt.shape[0]):
          num += txt.iloc[i,:]
      img.append(num[0])  提取出了图像
      filelable = filename.split('_')[0]   用文件名提取第0个
      labels.append(filelable)  加入标签列
   test['img'] = img
   test['lables'] = lables
return test

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
构建分类器
1 计算距离公式 约会的是欧氏距离 手写识别复杂所以不行
可以用levenshtein 包里面的 hamming 函数
hanmming距离格式: Levenshtein。hamming(str
,str2)
计算的是两个等长的字符串之间对应位置上不同字符的个数 所以输入的字符串必须长度一致
ps: hamming(‘abc’,‘aac’)
print(1)
hanmming(‘0010’,‘1110’)----3个
在这里插入图片描述

import Levenshtein
from Levenshtein import hamming

def handwritingClass(train,test,k)
   n = train.shape[0]
   m = test.shape[0]
   result = []  放最后结果
   循环套循环  因为hamming只能两个两个比较 不能广播
   for i in range(m):
        dist = [] 放在循环之外 因为放在里面会清空列表,所以放在外面
        for j in range(n):
           d = str(hamming(train.iloc[j,0],test.iloc[i,0]))  距离  最后变成str形式
           dist.append(d)
        dist_l =pd.DataFrame({'dist':dist,'lables':(train.iloc[:,1])})
        dr = dist_1.sort_values(by = 'dist')[:k]
        re = dr.loc[:,'labels'].value_counts()
        result.append(re.index[0])
    result = pd.Series(result)
    test['predict'] = result
    acc = (test.iloc[:,-1] == test.iloc[:,-2]).mean
    print(f'准确率未{acc}')
    return test
``
结果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210309115220507.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MzQ3OTkwMg==,size_16,color_FFFFFF,t_70)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值