数字识别[Digit Recognizer](https://www.kaggle.com/c/digit-recognizer)

本文是Kaggle Digit Recognizer中一个数字识别的题目这里用k-NN算法实现,个人PC双核8G内存,跑出结果大概2个小时左右,本来想用腾讯云折腾,可是直接报出MemoryError,内存不够.识别数字准确率为95.343%,效果还是不错的但是在Kaggle排名还是1000+.即便是那么一个简单的模型用到数据较大时也会发现很多的遗漏之处,很多的隐藏的bug慢慢调试了好几天才解决,自己也总结了一些经验,在数据较大时可以自己构造一些数据进行测试,否则直接在数据集上应用算法,非常或者根本无法从数据中测试算法,也看了很多人写的k-NN大部分都是<<机器学习实战>>上的代码,自己看起来不那么明白就重新实现了一遍,当然也有参考书中的代码,接下来我会使用这个模型应用在Titanic: Machine Learning from Disaster,实验这一模型在不同应用中的表现,若有问题联系本人qq:14435635交流.下面附上本人的渣代码.

from numpy import *
from audioop import reverse
#获取训练集和测试集
def getData(train_path, test_path):
    label = zeros((42000, 1))#建立标签集矩阵
    train_data = zeros((42000, 784))#建立训练集矩阵
    test_data = zeros((28000, 784))#建立测试集矩阵
    train_fr = open(train_path)#打开所给数据的文件
    test_fr = open(test_path)#打开所给测试的文件

    k = 0
    i = 0
    for line in train_fr.readlines():#对于每一行为一个二进制图片
        if k == 1:#第0行为标签名称,所以从第一行开始遍历图片
            line = line.split(',')
            length = len(line) - 1
            label[i, 0] = int(line[0])#训练数据的第一行为标签lable
            for j in range(length):#将图片转化为二进制数据
                if int(line[j + 1]) > 0:
                    train_data[i, j] = 1
                else:
                    train_data[i, j] = 0
            i += 1
        k = 1

    i = 0
    j = 0
    k = 0
    print 'get train data successful..........'
    for line in test_fr.readlines():#文件中的每一行为一个测试文件
        if k == 1:#同上,从第一行开始遍历
            line = line.split(',')
            for j in range(length):#转化为二进制文件
                if int(line[j]) > 0:
                    test_data[i, j] = 1
                else:
                    test_data[i, j] = 0
            i += 1
        k = 1
    print 'get test data successful..........'
    return label, train_data, test_data#返回了标签矩阵,训练矩阵,测试矩阵


def getDistance(label, train, test, k_1):
    train_size = train.shape[0]
    print 'getting distance...................'
    count_temp = 1
    f = open('result.csv', 'w')#将结果存储到文件当中
    for line in test:
        classCount = {}
        diffMat = tile(line, (train_size, 1)) - train#将训练数据的每一行生成一个矩阵与测试矩阵向减即a-b
        sqDiffMat = multiply(diffMat, diffMat)#这里是对于矩阵当中的每一个数字都平方而不是矩阵的平方
        sumMat = sqDiffMat.sum(axis=1)#矩阵的每一行的和
        distance_index = sqrt(sumMat).T.argsort()#对矩阵开方后,对距离的index的排序
        for index in range(k_1):#这里的k_1即为K-NN中的k,去除前k个距离最近的数据
            label_int = label[distance_index[index], 0]
            classCount[label_int] = classCount.get(label_int, 0) + 1
        sortedClassCount = sorted(classCount.iteritems(), key=lambda x:x[1], reverse=True)#sortedClassCount存储前k个数字出现的次数,对该字典的次数排序
        temp = str(count_temp) +','+ str(int(sortedClassCount[0][0])) + '\n'#构造a,b的数据格式
        count_temp += 1
        print temp
        f.write(temp)#将结果写入文件
    f.close()

label, train, test = getData('train.csv', 'test.csv')
print 'get data successful.....................'
getDistance(label, train, test, 20)

你可能感兴趣的:(Machine,Learning)