knn應該算是最簡單的有監督學習了。
所以爭取在2分鐘內看懂,挑戰一下[ ^-^]
通俗講:
要對乙個物體分類,就在小本本(資料集)裡找出乙個差不多特徵的物體,看一下這個物體的標籤就知道怎麼分類了。
比如說:
輸入物件是」乙個長了鬍子的人」,你翻開小本本查到乙個外形差不多(也長了鬍子),外貌很接近那麼也可以分作一類。
理解了上面的意思,就理解了knn的一半。knn是在』小本本』裡面找k個特徵相似的物體,不止乙個哦。k的取值可以根據具體情況調節(調參工程師的重任啊!),可以取k=1,2,3,4,5…
注: 也有專門訓練k值的神經網路,在這裡不討論。
如果取到的k個相似的物體,但這些物體的label不一樣怎麼辦!
1. 可以用投票法,比如取k=5,有三個都是a類別,那麼就把這個物體分類為a;
2. 可以用加權投票法,k個參考體按相似度進行排序,越相近權重越大,再進行乙個加權投票。
以上就是knn的操作,是不是灰常簡單。
knn具有一下特點:
1.沒有訓練過程,又稱為「懶惰學習」
2. inference過程是遍歷資料集,要保證inference效率的話,資料集不宜過大
可以結合**深入理解一下knn(
#-*- coding: utf-8 -*-
from numpy import *
import operator
'''構造資料'''
defcreatedataset
(): characters=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels=['a','a','b','b']
return characters,labels
'''從檔案中讀取資料,將文字記錄轉換為矩陣,提取其中特徵和類標'''
deffile2matrix
(filename):
fr=open(filename)
arrayolines=fr.readlines()
numberoflines=len(arrayolines) #得到檔案行數
returnmat=zeros((numberoflines,3)) #建立以零填充的numberoflines*3的numpy矩陣
classlabelvector=
index=0
for line in arrayolines: #解析檔案資料到列表
line=line.strip()
listfromline=line.split('\t')
returnmat[index, : ]=listfromline[0:3]
index+=1
return returnmat,classlabelvector #返回特徵矩陣和類標集合
'''歸一化數字特徵值到0-1範圍'''
'''輸入為特徵值矩陣'''
defautonorm
(dataset):
minvals=dataset.min(0)
maxvals=dataset.max(0)
ranges=maxvals-minvals
normdataset=zeros(shape(dataset))
m=dataset.shape[0]
normdataset=dataset-tile(minvals,(m,1))
normdataset=normdataset/tile(ranges,(m,1))
return normdataset, ranges, minvals
defclassify
(sample,dataset,labels,k):
datasetsize=dataset.shape[0] #資料集行數即資料集記錄數
'''距離計算'''
diffmat=tile(sample,(datasetsize,1))-dataset #樣本與原先所有樣本的差值矩陣
sqdiffmat=diffmat**2
#差值矩陣平方
sqdistances=sqdiffmat.sum(axis=1) #計算每一行上元素的和
distances=sqdistances**0.5
#開方 sorteddistindicies=distances.argsort() #按distances中元素進行公升序排序後得到的對應下標的列表
'''選擇距離最小的k個點'''
classcount={}
for i in range(k):
voteilabel=labels[sorteddistindicies[i]]
classcount[voteilabel]=classcount.get(voteilabel,0)+1
'''從大到小排序'''
sortedclasscount=sorted(classcount.items(),key=operator.itemgetter(1),reverse=true)
return sortedclasscount[0][0]
'''針對約會**資料的測試**'''
defdatingclasstest
(): horatio=0.20
#測試樣例資料比例
datingdatamat,datinglabels=file2matrix('datingtestset1.txt')
normmat, ranges, minvals=autonorm(datingdatamat)
m =normmat.shape[0]
numtestvecs=int(m*horatio)
errorcount=0.0
k=4for i in range(numtestvecs):
classifierresult=classify(normmat[i, : ],normmat[numtestvecs:m, : ], datinglabels[numtestvecs:m],k)
print("the classifier came back with: %s, the real answer is: %s" % (classifierresult, datinglabels[i]))
if(classifierresult != datinglabels [i] ) :
errorcount += 1.0
print("the total error rate is: %f" % (errorcount/float(numtestvecs)))
defmain
(): sample=[0,0]
k=3group,labels=createdataset()
label=classify(sample,group,labels,k)
print("classified label:"+label)
if __name__=='__main__':
main()
#datingclasstest()
KNN k近鄰演算法
現在假如我們已經擁有了一些資料 稱為訓練資料集 ts,並且擁有所有資料的類別名 即每條資料應該歸於哪個類別。當我們要判斷一條不知類別的資料時,首先讓這條資料m和已經擁有的所有的資料ts中的每一條資料進行比較,然後根據比較結果選擇出和m最相似 一般是基於距離 的k條資料 k是個整數,並且通常是小於20...
kNN(k近鄰演算法)
k近鄰分析 knn 一 概述 knn演算法是一種有監督學習的分類演算法。所謂有監督學習,就是在應用演算法之前我們必須準備一組訓練集,訓練集中的每個例項都是由一些特徵和乙個分類標籤組成 通常還會存在乙個測試集,用來測試訓練出來的分類模型的準確性。其實knn演算法並沒有體現出有監督學習的所有特點,沒有模...
kNN k近鄰演算法
一 knn演算法的思想 knn演算法作為機器學習演算法中非常有效比較容易掌握的演算法,其基本思想是採用測量不同特徵值之間的距離的方法進行分類。knn屬於監督學習演算法,它的工作原理是 存在乙個樣本資料集,訓練樣本集,並且樣本集中的每個資料都存在標籤,即我們知道樣本集中每乙個資料與所屬分類的對應關係。...