對於未知類別資料集中的點與當前點的距離
1. 計算已知類別資料集中的點與當前點的距離
2.按照距離依次排序
3.選取與當前點距離最小的k個點
4.確定前k個點所在類別的出現概率
5.返回前k個點出現頻率最高的類別作為當前點**分類
概述:
knn演算法本身簡單有效,它是一種lazy-learning演算法;
分類器不需要使用訓練集進行訓練,訓練時間複雜度為0;
knn分類的計算複雜度和訓練集中的文件數目成正比,也就是說,如果訓練集中文件總數為n,那麼knn的分類時間複雜度為o(n)。
該演算法的三個基本要素:
1. k值的選擇;
2. 距離度量;
3. 分類決策規則
問題:
該演算法在分類時有個主要的不足是,當樣本不平衡時,如乙個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入乙個新樣本時,該樣本的k個鄰居大容量的樣本占多數。
解決:
不同的樣本給予不同權重項。
**如下:
import numpy as np
import operator
defcreatedataset
(): group = np.array([[1.0,1.1],[1.0,1.0],[0.0,0.0],[0,0.1]])
labels = ['a','a','b','b']
return group,labels
defclassify0
(inx,dataset,labels,k):
datasetsize = dataset.shape[0]
diffmat = np.tile(inx, (datasetsize,1)) - dataset
sqdiffmat = diffmat ** 2
sqdistances = sqdiffmat.sum(axis = 1)
distance = sqdistances **0.5
sorteddistindicies = distance.argsort()
classcount = {}
for i in range(k):
votelabel = labels[sorteddistindicies[i]]
classcount[votelabel] = classcount.get(votelabel,0) + 1
sortedclasscount = sorted(classcount.iteritems(),key=operator.itemgetter(1),reverse=true)
return sortedclasscount[0][0]
deffile2matrix
(filename):
fr = open(filename)
arrayoflines = fr.readlines()
numoflines = len(arrayoflines)
returnmat = np.zeros((numoflines,3))
classlabelvector =
index = 0
for line in arrayoflines:
line = line.strip()
listfromline = line.split('\t')
returnmat[index,:] = listfromline[0:3]
index += 1
return returnmat,classlabelvector
defautonorm
(dataset):
minvals = dataset.min(0)
maxvals = dataset.max(0)
ranges = maxvals - minvals
m = dataset.shape[0]
normdataset = np.zeros(np.shape(dataset))
normdataset = dataset - np.tile(minvals,(m,1))
normdataset = normdataset / np.tile(ranges,(m,1))
return normdataset,ranges,minvals
defdatingclasstest
(): horatio = 0.1
datingdatamat,datinglabels = file2matrix('datingtestset2.txt')
normmat,ranges,minvals = autonorm(datingdatamat)
m = normmat.shape[0]
numtestvecs = int(m*horatio)
errorcount = 0.0
for i in range(numtestvecs):
classifierresult = classify0(normmat[i,:],normmat[numtestvecs:m,:], datinglabels[numtestvecs:m],4)
print ('the classifier came back with: %d , the real answer is : %d' %(classifierresult, datinglabels[i]))
if (classifierresult != datinglabels[i]):
errorcount += 1.0
print ('total result is : %f' %(errorcount / float(numtestvecs))
defclassifyperson
(): resultlist = ['not at all', 'in small does','in large does']
input_man= [20000, 10, 5]
datingdatamat,datinglabels = file2matrix('datingtestset2.txt')
normmat,ranges,minvals = autonorm(datingdatamat)
result = classify0((input_man - minvals) / ranges,normmat,datinglabels,3)
print ('you will probably like this person:' , resultlist[result-1])
if __name__ == '__main__':
# group,labels = createdataset()
# test = classify0([3,3],group,labels,3)
# print test
classifyperson()
output: a k近鄰法原理及程式設計實現
給定乙個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最鄰近的k個例項,這k個例項的多數屬於某個類,就把該輸入例項分為這個類。1.距離度量 兩個例項之間的距離可以用l pl p lp 範數來定義,其中p可以選擇。l pl p lp 範數的定義為 這裡面的x ix i xi 和x jx j x...
k 近鄰演算法
此文章參考機器學習實戰一書,具體的理論知識可以參考該書。本文的初衷只是為了做乙個複習,將學過的知識加以整理,其中不免有一定的錯誤。2.k 近鄰演算法的原理介紹 k 近鄰演算法通過測量不同的特徵值之間的距離進行分類。它的工作原理如下 存在乙個樣本的資料集合,也成為訓練樣本集合。並且樣本集中的每個資料都...
走進K近鄰
k最近鄰 k nearest neighbour,knn 分類演算法的思路是 如果乙個樣本在特徵空間中的k個最相似 即特徵空間中最鄰近 的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。k近鄰演算法的想法很簡單,類似於多數表決,關鍵點是參與多數表決的人是離你最近的k個人。給定乙個例項,首先從訓...