Kaggle练习赛-digit recognizer-kNN解法全部实现步骤

代码中给出了解释
请注意,本文基于kaggel官网数据格式的,请自行先去kaggle官网了解好,不是普通的knn解法

我是从python 新建文档里面直接黏贴过来的,格式神马的与csdn不和谐请原谅。。。。。。。

”’
由于kaggel给的都是csv数据,里面的数据格式还需要处理一下,关于python的csv使用不懂得先去查查资料,本代码用到,但是也只是用到了 读取文件和写入文件而已,你们看看这个足够了

http://blog.csdn.net/u012162613/article/details/41915859
”’

本文简单粗暴有力

==================下面是kaggle_kNN_digit_recognizer的具体代码实现============================

import csv
from numpy import *

======================================================================================================

根据train.csv 42001*785 生成两个矩阵trainlabel和traindata,由于csv是字符格式所有还要自己写个toint转换函数才行,而且由于是0~255灰度值的,所以还要归一化

def loadTrainData():
l=[]
with open(‘train.csv’) as myFile:
lines=csv.reader(myFile)
for line in lines:
l.append(line)
l.remove(l[0]) #第一行的文字部分我们不要的
l=array(l)
label=l[:,0]
data=l[:,1:]
return nomalizing(toInt(data)),toInt(label)
def toInt(array):
array=mat(array)
m,n=shape(array)
newArray=zeros((m,n))
for i in xrange(m):
for j in xrange(n):
newArray[i,j]=int(array[i,j])
return newArray
def nomalizing(array):#其实归一化可以在toint里面一起完成的哦
m,n=shape(array)
for i in xrange(m):
for j in xrange(n):
if array[i,j]!=0:
array[i,j]=1
return array

========================================================================================================

========================================================================================================

同样需要处理test.csv 28001*784 格式

def loadtestData():
l=[]
with open(‘test.csv’) as myFile:
lines=csv.reader(myFile)
for line in lines:
l.append(line)
l.remove(l[0]) #第一行的文字部分我们不要的
data=array(l)
return nomalizing(toInt(data))

========================================================================================================

=============================================前方高能,kNN核心处理算法=====================================

对于28000个样本,调用28000次这个函数即可,可以参见主函数

这部分不懂得,如果kNN核心算法不懂得话,请先去看机器学习算法里面的解释或者猛戳http://blog.csdn.net/u012162613/article/details/41768407,但是这个链接里面的数据格式不是

kaggle给出的csv格式,请看思想即可
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[0,sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]

=============================================当然要保存数据了,生成csv文件 28000*1 的=======================

def saveResult(result):
with open(‘result.csv’,’wb’) as myFile:
myWriter=csv.writer(myFile)
for i in result:
tmp=[]
tmp.append(i)
myWriter.writerow(tmp)

=========================================================================================================

============================最后,主函数,把数据预处理,knn计算,结果输出合并起来,4个调用一个不少================

def handwritingClassTest():
trainData,trainLabel=loadTrainData() #调用1
testData=loadTestData() #调用2
##
##testLabel=loadTestResult()如果官方给出了结果 可以下载下来并自己写一个这样的函数处理一下并看看,但是现在官方都不给了,就不用写这个函数了,我前面也没有写的。。自己

直接把自己的结果上传即可,官方给你对比看正确率
##
##errorCount=0
m,n=shape(testData)
resultList=[]
#一共调用了28000次kNN核心算法。。。。。泪。。。。样本愈多,调用次数越多。。。这就是knn方法机器学习的特点。。。。。
for i in range(m):
classifierResult = classify(testData[i], trainData, trainLabel, 5) #调用3 ,k选5是可以的,不要大于20,计算量啊计算量衰
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)) #因为如果你想看错误率的话,那必须是float的呀
saveResult(resultList) #调用4

==========================================================================================================

这就是数据读取,使用knn算法,数据输出的全部过程,用python总共只有五十代码左右~我想注释神马的够详细了吧

你可能感兴趣的:(Kaggle练习赛-digit recognizer-kNN解法全部实现步骤)