#!/usr/bin/python # -*- coding: utf-8 -*- from numpy import * import operator def createDataSet(): '創建數據集' group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,1.1]]) labels=["A","A","B","B"] return group,labels def classify(inX,dataSet,labels,k): # 獲取維度 dataSetSize=dataSet.shape[0] # 訓練數據集數量 print dataSetSize print tile(inX,(dataSetSize,1)) diffMat=tile(inX,(dataSetSize,1))-dataSet # 測試樣本的各維度的差值 print diffMat sqDiffMat=diffMat**2 # 平方計算 print sqDiffMat sqDistance=sqDiffMat.sum(axis=1) # 輸出每行的值 print sqDistance distances=sqDistance**0.5 # 開方計算 print distances sortedDistances=distances.argsort() # 排序 按距離從小到大 輸出索引 print sortedDistances classCount={} for i in range(k): voteIlabel=labels[sortedDistances[i]] classCount[voteIlabel]=classCount.get(voteIlabel,0)+1.0 sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True) return sortedClassCount[0][0] group,labels=createDataSet() res=classify([1,1],group,labels,3) print res
一:什么是看KNN算法?
kNN算法全稱是k-最近鄰算法(K-Nearest Neighbor)
kNN算法的核心思想是如果一個樣本在特征空間中的k個最相鄰的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。該方法在確定分類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。
下邊舉例說明:
即使不知道未知電影屬於哪種類型,我們也可以通過某種方法計算出來,如下圖
現在我們得到了樣本集中與未知電影的距離,按照距離的遞增順序,可以找到k個距離最近的電影,假定k=3,則三個最靠近的電影是和he is not realy into Dudes,Beautiful women, California man kNN算法按照距離最近的三部電影類型決定未知電影類型,這三部都是愛情片,所以未知電影的類型也為愛情片
二:KNN算法的一般流程
step.1---初始化距離為最大值
step.2---計算未知樣本和每個訓練樣本的距離dist
step.3---得到目前K個最臨近樣本中的最大距離maxdist
step.4---如果dist小於maxdist,則將該訓練樣本作為K-最近鄰樣本
step.5---重復步驟2、3、4,直到未知樣本和所有訓練樣本的距離都算完
step.6---統計K-最近鄰樣本中每個類標號出現的次數
step.7---選擇出現頻率最大的類標號作為未知樣本的類標號
三:距離公式
在KNN中,通過計算對象間距離來作為各個對象之間的非相似性指標,避免了對象之間的匹配問題,在這里距離一般使用歐氏距離或曼哈頓距離:

