您的位置:首页 > 编程语言 > Python开发

KNN算法--手写输入判断(Python3)

2017-10-21 18:13 417 查看
可能对于有些人在以前看过这个例子,但是很不巧的是Python3和Python2的之间的一些差异,导致了照搬原来的那份是不能用了。

这里,我根据自己的情况和进行了改写

要数据集的话,可以给我私信,或者是在评论去留言。我看到就会回复

记得用的时候,改写下那个文件名,看你自己是把数据放到哪了,就写哪。

from numpy import *
import os
import operator

def classify0(inX, dataSet, labels, k):
# k means how many you need to get your P(x)
dataSetSize = dataSet.shape[0]
DiffMat = tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = DiffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5  # 到这里求解了欧式距离(并构成了一个array)
sortedDistances = distances.argsort()
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistances[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
# 选出了距离最小的k个点,并且做了一个简单的统计

sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)  # 按照第一个(从0开始数)进行排序
return sortedClassCount[0][0]   # 返回的出现次数最多的那个标签

# 将32*32图片转换成向量(实际生活中,往往都会有更大的尺寸)
def img2vector(filename):
returnVect = zeros((1, 1024))  # 将32 *32 的矩阵转换成一个 1*1024的向量
fr = open(filename)
for i in range(32):
lineStr = fr.readline()
for j in range(32):
returnVect[0, 32 * i + j] = int(lineStr[j])
return returnVect

def handwritingClassTest():
hwLabels = []
trainingFileList = os.listdir('E:/Code/Python/test/KNN算法/digits/trainingDigits')  # 得到文件列表
m = len(trainingFileList)  # 得到文件夹列表长度
traingMat = zeros((m, 1024))  # 训练集合
for i in range(m):
fileNameStr = trainingFileList[i]
fileStr = fileNameStr.split('.')[0]   # 得到了文件名(去掉了后缀)
classNumStr = int(fileStr.split('_')[0])  # 要注意到数据集格式 得到了分类数字
hwLabels.append(classNumStr)
traingMat[i, :] = img2vector('E:/Code/Python/test/KNN算法/digits/trainingDigits/%s' % fileNameStr)
# 上面得到了数据集

testFileList = os.listdir('E:/Code/Python/test/KNN算法/digits/testDigits')
errorCount = 0.0  # 统计出错
mTest = len(testFileList)
for i in range(mTest):
fileNameStr = testFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
vectorUnderTest = img2vector('E:/Code/Python/test/KNN算法/digits/testDigits/%s' % fileNameStr)
classifyResult = classify0(vectorUnderTest, traingMat, hwLabels, 3)
# print("the predicted number is %d, and the real number is %d" % (classifyResult, classNumStr))

if classifyResult != classNumStr:
errorCount += 1.0
print("The error times is %d" % errorCount)
print("The error rate is %.3f" % (errorCount / float(mTest)))

if __name__ == "__main__":
handwritingClassTest()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: