Kaggle-Digit Recognizer kNN解决方案

一、题目

https://www.kaggle.com/c/digit-recognizer

二、kNN算法

请参考https://www.jianshu.com/p/dddd1c348553

三、代码

编程语言使用python 3.6

from numpy import *
import operator
import csv
import pdb
def toInt(array):
    array=mat(array)
    m,n=shape(array)
    newArray=zeros((m,n))
    for i in range(m):
        for j in range(n):
                newArray[i,j]=int(array[i,j])
    return newArray
def nomalizing(array):
    m,n=shape(array)
    for i in range(m):
        for j in range(n):
            if array[i,j]!=0:
                array[i,j]=1
    return array
def loadTrainData():
    l=[]
    with open('train.csv') as file:
         lines=csv.reader(file)
         for line in lines:
             l.append(line) #42001*785
    l.remove(l[0])  # remove row 0, get 42000*785
    l=array(l)      # transfer list to array
    label=l[:,0]    # 从0行0列取到最后一行0列, 显示为1行42000列,而不是42000行1列
    data=l[:,1:]    # from row 0 to the last row, from col 1 to the last col, 42000*784
    return nomalizing(toInt(data)),toInt(label)  #data 42000*784   label 1*42000  
def loadTestData():
    l=[]
    with open('test.csv') as file:
         lines=csv.reader(file)
         for line in lines:
             l.append(line)
     #28001*784
    l.remove(l[0]) #28000*784
    data=array(l)
    return nomalizing(toInt(data))  #  data 28000*784
def loadTestResult():
    l=[]
    with open('knn_benchmark.csv') as file:
         lines=csv.reader(file)
         for line in lines:
             l.append(line)
     #28001*2
    l.remove(l[0]) #28000*2
    label=array(l)  
    return toInt(label[:,1])  #  label 1*28000
#inX:1*n  dataSet:m*n   labels:m*1  
def classify(inX, dataSet, labels, k): 
    inX=mat(inX)
    dataSet=mat(dataSet)
    labels=mat(labels)
    dataSetSize = dataSet.shape[0]                  
    diffMat = tile(inX, (dataSetSize,1)) - dataSet   
    sqDiffMat = array(diffMat)**2
    sqDistances = sqDiffMat.sum(axis=1)                  
    distances = sqDistances**0.5
    sortedDistIndicies = distances.argsort()            
    classCount={}                                      
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i],0]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]
def saveResult(result):
    with open('result.csv', 'w', newline = '') as myFile:    
        myWriter=csv.writer(myFile)
        for i in result:
            tmp=[]
            tmp.append(i)
            myWriter.writerow(tmp)
def Test():
    trainData,trainLabel=loadTrainData()
    testData=loadTestData()
    testLabel=loadTestResult()
    m,n=shape(testData)
    errorCount=0
    resultList=[]
    for i in range(m):
        print ("classify: ",i)
        classifierResult = classify(testData[i], trainData[0:20000], trainLabel.transpose()[0:20000], 5)
        resultList.append(classifierResult)
        print ("the classifier came back with: %d, the real answer is: %d" % (classifierResult, testLabel[0,i]))
        if (classifierResult != testLabel[0,i]): 
            errorCount += 1.0
        print ("\nthe total number of errors is: %d" % errorCount)
        print ("\nthe total error rate is: %f" % (errorCount/float(m)))
    saveResult(resultList)

运行程序: 打开cmd窗口,进入上述代码knn.py所在的目录,进入python环境 执行命令

import knn
knn.Test()

execute.png

运行结果:

result.png

四、Github代码下载

下载地址

五、参考

https://blog.csdn.net/u012162613/article/details/41929171

原文发布于微信公众号 - 海天一树(gh_de7b45c40e8b)

原文发表时间:2018-04-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐享123

Megacli Cheat

13540
来自专栏QQ音乐技术团队的专栏

ContentProvider 引发闪退之谜

CP 在跨进程调用的场景中,作为数据提供的进程称作 Server 进程,请求数据的进程称作 Client 进程。当我们享受它在跨进程场景下带来的便利时,可能未曾...

1.1K00
来自专栏GIS讲堂

lzugis——Arcgis Server for JavaScript API之自定义InfoWindow

各位看到这个标题不要嫌烦,因为本人最近一直在研究相关的问题,所以相关文章也只能是这些,同时希望看过我的文章的朋友,我的文章能够给你帮助。

12340
来自专栏闵开慧

NameError: name 'admin' is not defined(彻底解决方案)

1 查看model.py文件,具体操作如: root@ubuntu118:/home/python/work/mysite/mysite/blo...

45170
来自专栏机器人网

机器人变位机减速器选型

1、 实心型RV减速器型号:日本帝人RV减速器第一种:实心型RV-40E-105-B-B 伺服电机与减速器连接轴连接采用右下图所示: ? 2、 空心型RV减速器...

30250
来自专栏DeveWork

几款更换WordPress 后台UI 的插件推荐

WordPress 3.8出来了,最大的改变就是全新扁平化后台UI。如果你对这个后台UI 不怎么感冒甚至有些反感(尼玛怎么那么丑啊?!)不妨用下面的插件来尽可能...

40170
来自专栏林冠宏的技术文章

js 调用百度地图,并且定位用户地址,显示省市区街,经纬度

网上的一些百度地图例子,基本上没有连套的 定位 例子。下面我分享一套我自己弄的,废话不多说,看代码,里面有注释! 1 <!DOCTYPE html> 2...

98490
来自专栏转载gongluck的CSDN博客

第17章 ioctl操作

#include <sys/ioctl.h> int ioctl(int fd, unsigned long request, ...); /usr/src/...

39090
来自专栏运维前线

Dell服务器常用管理命令总结

Dell服务器常用管理命令总结 准备新版本的 MegaCli-8.07.14-1.noarch.rpm 会把程序安装在/opt下,可以自定义安装目录,例如: ...

27370
来自专栏我和未来有约会

简练的视图模型 ViewModel

patterns & practices Developer Center 发布了 Unity Application Block 1.2 for Silver...

27490

扫码关注云+社区

领取腾讯云代金券