代码中给出了解释
请注意,本文基于kaggel官网数据格式的,请自行先去kaggle官网了解好,不是普通的knn解法
”’
由于kaggel给的都是csv数据,里面的数据格式还需要处理一下,关于python的csv使用不懂得先去查查资料,本代码用到,但是也只是用到了 读取文件和写入文件而已,你们看看这个足够了
http://blog.csdn.net/u012162613/article/details/41915859
”’
import csv
from numpy import *
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
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))
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]
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)
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