前言

kNN的玩法强化练习一下。


数据集准备

here

数据集处理读取

说是Cross-validation文件,不过我也只是把它当训练测试集用,前面有一些不需要读取的数据可以删掉:

再看数据部分:

可以看到每个数字图片为32x32的大小,最后一行是其标签。

读取数据集:

def file2matrix(filename):
    f = open(filename)
    arrayOfLines = f.readlines()
    numberOfLines = len(arrayOfLines)
    assert numberOfLines % 33 == 0
    numberOfDigits = int(numberOfLines / 33)
    myMat = zeros((numberOfDigits, 1024))
    labels = []
    for x in range(numberOfDigits):
        for y in range(32):
            for z in range(32):
                myMat[x, 32 * y + z] = int(arrayOfLines[x * 33 + y][z])

        labels.append(arrayOfLines[x * 33 + 32].strip())
    return myMat, labels

归一化就不用做了,然后分割训练测试,因为文本中的数据原本就是乱序,所以直接取前70%做训练集:

trainRatio = 0.7
myMat, labels = file2matrix("E:/dataSet/kNN/optdigits-orig.cv")
numberOfMat = myMat.shape[0]
numberForTrain = int(trainRatio * numberOfMat)
numberForTest = numberOfMat - numberForTrain
kNN = KNeighborsClassifier(8)
kNN.fit(myMat[:numberForTrain], labels[:numberForTrain])
predictResult = kNN.predict(myMat[numberForTrain:])
errorCount = 0
index = 0
for result in predictResult:
    print("the classifier came back, with: %d, the real answer is: %d" % (predictResult[index] ,labels[numberForTrain + index]))
    if (predictResult[index] != labels[numberForTrain + index]): 
        errorCount += 1.0
    index += 1
print("the total error rate is: %f" % (errorCount / float(numberForTest)))

最后结果:

大概有95.8%的准确率,还行。


后记

这个数据集有900多个样本,kNN处理速度还行。


机器学习

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

机器学习入门3
机器学习入门1