K-nearest neighbor(KNN)
1.k 近鄰模型
距離度量
特徵空間中兩個樣本的距離是兩個樣本的相似程度的反映。在
(1)Minkowski Distacne(閔可夫斯基距離)
定義兩個變量
當
當
當
上述距離在不同特徵中存在一定的缺點,比如特徵維度中不同的單位,如果用絕對值會導致比重不一,因此不同的特徵都需要歸一化,即統一爲相對值。
(2)馬氏距離(Mahalanobis distance)
定義兩個變量
其中
(3)夾角餘弦(Cosine)
夾角餘弦可以用來衡量兩個特徵向量方向的差異,機器學習中常用這一概念來衡量樣本的差異,對於給定變量,其定義爲:
夾角餘弦越大表示兩個向量夾角越小,向量相似度越高。夾角餘弦度量的特徵距離常用在自然語言處理中,是很常用的機器學習特徵向量度量手段。
其餘衡量樣本相似度的手段還有漢明距離,傑卡德相似係數,相關係數和信息熵等。不同距離標準的選擇對於KNN最終的分類結果是可能不同的。
k 值選擇
如果選擇較小的
通常選取交叉驗證法來選取
分類決策規則
在KNN中常用的分類決策規則往往是多數表決,即由距離測試樣本最近的
分類函數:
那麼誤分類的概率:
給定樣本
要使誤分類率最小,即經驗風險最小,就要使
2.k 近鄰算法
- Algorithm 3.1
- Input: traning_data
T={(x1,y1),(x2,y2),…,(xN,yN)} , testing_data(xi,yi) - Output: the label of
yi - calculate all distances between testing_data and training_data
- select the nearest
k sampleNk(x) voting rule:
yi=argmax∑xi∈Nk(x)I(yi=cj) KNN算法的簡單實現
# Project: Machine Learning-KNN
# Author:Lyndon
# Date: 2015/10/18
from numpy import *
import operator
# Creating training data
def createdata():
group = array([[1,1],[1,1.1],[0.9,1],[0,0.1],[0.1,0],[0.1,0.1],[0,1],[0.1,0.9],[0,0.8]])
labels = ['A','A','A','B','B','B','C','C','C']
return group,labels
# testing process
def knnclassify(testing_data,group,labels,k):
datasize = group.shape[0] #the rows of array
# calculate the distance
diffMat = tile (testing_data,(datasize,1))-group
sqdiffMat = diffMat**2
sqdiffMatsum=sqdiffMat.sum(axis=1)
distances = sqdiffMatsum**2
# majority voting rule
classcount={}
sortdistances = distances.argsort()
for i in range(k):
votelabel = labels[sortdistances[i]]
classcount[votelabel] = classcount.get(votelabel,0)+1
sortclass=sorted(classcount.iteritems(),key=operator.itemgetter(1),reverse=True)
return sortclass[0][0]
# main
if __name__ == "__main__":
string=raw_input("please enter two numbers, split by comma:")
input_data= string.split(",")
testing_data= []
for i in range(len(input_data)):
testing_data.append(float(input_data[i]))
string1=raw_input("please enter the k:")
k=int(string1)
group,labels = createdata()
label=knnclassify(testing_data,group, labels, k)
print "the label of input data is:" + str(label)
PS:本文爲機器學習(3)總結筆記,通過python實現了簡單分類,原理主要參考李航《統計學習理論》第三章。