#coding=utf8
#KNN.py
from numpy import *
import operator
def createDataSet():
group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) #我覺得可以這樣理解俏拱,每一種方括號都是一個維度(秩)轻姿,這里就是二維數(shù)組,最里面括著每一行的有一個方括號陈莽,后面又有一個键闺,就是二維寿烟,四行
labels=['A','A','B','B']
return group,labels
def classify0(inX,dataSet,labels,k): #inX是你要輸入的要分類的“坐標”,dataSet是上面createDataSet的array辛燥,就是已經(jīng)有的筛武,分類過的坐標,label是相應(yīng)分類的標簽挎塌,k是KNN徘六,k近鄰里面的k
dataSetSize=dataSet.shape[0] #dataSetSize是sataSet的行數(shù),用上面的舉例就是4行
diffMat=tile(inX,(dataSetSize,1))-dataSet #前面用tile榴都,把一行inX變成4行一模一樣的(tile有重復(fù)的功能待锈,dataSetSize是重復(fù)4遍,后面的1保證重復(fù)完了是4行缭贡,而不是一行里有四個一樣的)炉擅,然后再減去dataSet辉懒,是為了求兩點的距離阳惹,先要坐標相減,這個就是坐標相減
sqDiffMat=diffMat**2 #上一行得到了坐標相減眶俩,然后這里要(x1-x2)^2莹汤,要求乘方
sqDistances=sqDiffMat.sum(axis=1) #axis=1是行相加,颠印,這樣得到了(x1-x2)^2+(y1-y2)^2
distances=sqDistances**0.5 #開根號纲岭,這個之后才是距離
sortedDistIndicies=distances.argsort() #argsort是排序抹竹,將元素按照由小到大的順序返回下標,比如([3,1,2]),它返回的就是([1,2,0])
classCount={}
for i in range(k):
voteIlabel=labels[sortedDistIndicies[i]]
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 #get是取字典里的元素止潮,如果之前這個voteIlabel是有的窃判,那么就返回字典里這個voteIlabel里的值,如果沒有就返回0(后面寫的)喇闸,這行代碼的意思就是算離目標點距離最近的k個點的類別袄琳,這個點是哪個類別哪個類別就加1
soredClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True) #key=operator.itemgetter(1)的意思是按照字典里的第一個排序,{A:1,B:2},要按照第1個(AB是第0個)燃乍,即‘1’‘2’排序唆樊。reverse=True是降序排序
return soredClassCount[0][0] #返回類別最多的類別
轉(zhuǎn)載自http://blog.csdn.net/fenfenmiao/article/details/52165472