AI數學 kNN k近鄰學習

2021-08-21 11:50:08 字數 3647 閱讀 4129

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屬於監督學習演算法,它的工作原理是 存在乙個樣本資料集,訓練樣本集,並且樣本集中的每個資料都存在標籤,即我們知道樣本集中每乙個資料與所屬分類的對應關係。...