機械学習実戦pythonとRで踊る


機械は実戦中のコードを学習し、学習し、交流する.一つ目はkNN分類関数である.以下はPythonのコードですが、後で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])
}