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 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 读入文件
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)