機械学習実戦pythonとRで踊る
機械は実戦中のコードを学習し、学習し、交流する.一つ目はkNN分類関数である.以下はPythonのコードですが、後でRで書いてみましたが、データを処理する上でRが強いことに気づきました.
下はRのコードですが、初学なのでコメントをたくさん添付しておりますので、ご了承ください.
#!/usr/bin/python
from numpy import *
import operator
def classfy0(inX,dataSet,labels,k):
dataSetSize=dataSet.shape[0] # shape ,
diffMat=tile(inX,(dataSetSize,1))-dataSet #tile , ,
sqDiffMat=diffMat**2
sqDistances=sqDiffMat.sum(axis=1) # ,
distances=sqDistances**0.5
sortedDistIndicies=distance.argsort() #
classCount={}
for i in range(k):
voteIlabels=labels[sortedDistIndicies[i]] # k ,sortedDistIndicies[i] , label 。
classCount[voteIlabels]=classCount.get(voteIlabels,0)+1 # ,get 0,
# , , , , , 1
sortedClassCount=sorted(classCount.iteritems(),
key=operator.itemgetter(1),reverse=True) # ,sorted key operator.itemgetter ,
#
return sortedClassCount[0][0] # , 。
下はRのコードですが、初学なのでコメントをたくさん添付しておりますので、ご了承ください.
kNN<-function(input, dataset,label,k){
if(class(input)!="numeric") stop(cat("you must input a numeric vector"))
if(class(dataset)!="matrix") stop(cat("you mush input your traning data as a matrix"))
datasize=nrow(dataset)
diffMat=matrix(rep(input,datasize),nrow=datasize,byrow = TRUE)-dataset
sqDiffMat=diffMat^2
sqDistances=apply(sqDiffMat,1,sum)
distances=sqrt(sqDistances)
sortedDistIndicies=order(distances)
classCount=list() # , , k ,
for(i in 1:k){
name=label[sortedDistIndicies[i]] # k sortedDistIndicies[i] , label 。
classCount[[name]]=c(classCount[[name]],1) # ,classCount[[name]] null,
# , , 1
}
results=lapply(classCount, function(x) sum(x)) # ,
return(results[1])
}