機器學習演算法 KNN近鄰演算法

2021-08-21 21:15:17 字數 4557 閱讀 8157

在研究機器學習演算法之前,先明確一些基本的概念

1:資料特徵:用於描述一條資料的一些特徵屬性,例如描述乙個人,可以用身高,體重,姓名的屬性來表述,這些資料就是資料的特徵。

2:資料類別:根據資料的特徵進行明確的分類。比如說身高1.7,體重60kg的這個人是小明。不滿足上面這些特徵的人不是小明。那麼「是小明」和「不是小明」則被稱作分類。

機器學習研究中乙個很重要的問題就是解決分類問題,即根據資料的特徵解決資料是屬於哪個類別。機器學習中,有下面一些很經典的分類演算法:

knn緊鄰演算法

決策樹演算法

貝葉斯分類

logistic回歸

下面先從最簡單的knn緊鄰演算法開始說明

knn演算法可以用來解決多種類別的分類問題,該演算法描述如下:

已知資料集合x,x包括若干不同的樣本和對應的分類結果y,y包括,當出現新的資料a時,求a資料對應的分類結果。

對於這樣乙個問題,knn演算法通過以下方法進行解決:

1:計算資料a與樣本集合x中所有樣本之間的距離,然後獲取距離最小(特徵最接近)的k個樣本資料對應的分類標籤

2:從這分類標籤中選擇最多的分類標籤為a資料的分類標籤。

knn演算法在執行時一般k的選擇不會超過20.

knn演算法計算資料a與樣本集合x中不同的資料距離時,可以採取以下公式進行

即對應的特徵差平方和開方得到。

knn演算法python**實現(使用minist資料集測試驗證)

importsys

importos

importstruct

importnumpyasnp

importoperator

importcv2

frommatplotlibimportpyplotasplt

defloadmnistimage(path):

withopen

(path,'rb')asimgfp:

magic, num, row, col = struct.unpack('>iiii', imgfp.read(

16))

imglen = row * col

imgs = np.fromfile(imgfp,

dtype

=np.uint8).reshape(num, imglen)

#read image from file and show it

#npfirstimg = np.array(list(imgfp.read(imglen))).reshape(row, col)

#plt.imshow(npfirstimg)

#plt.show()

returnimgs

defloadmnistlable(path):

withopen

(path,"rb")aslabelfp:

magic

, num

= struct.unpack('>ii', labelfp.read(8))

labels = np.fromfile(labelfp,

dtype

=np.uint8)

returnlabels

defgetpredictlablebyknn(trainimages, trainlabels, predictimage, knum=

20):

predictlist = {}

trainimagesnum =

len(trainimages)

fortrainimagesidxinrange

(trainimagesnum):

#calc the distance for preicitimage and trainimage

difsum =

0.0forpixidxinrange

(len

(predictimage)):

difsum += (np.int(predictimage[pixidx]) - np.int(trainimages[trainimagesidx][pixidx])) **

2#sqrt

distance = np.sqrt(difsum)

sortpredlist =

sorted

(predictlist.items(),

key

= operator.itemgetter(

1),

reverse

=true)  

#from big to little

iflen

(sortpredlist) < knum:

predictlist.update()

continue

ifdistance < sortpredlist[0][

1]:rmvkey = sortpredlist[0][

0]predictlist.pop(rmvkey)

predictlist.update()

#check the labels and return

predictlables = {}

foriteminpredictlist.items():

label = trainlabels[item[0]]

iflabelinpredictlables.keys():

predictlables.update()

else:

predictlables.update()

lablesrslist =

sorted

(predictlables.items(),

key=operator.itemgetter(

1),

reverse

=true)

print

(lablesrslist)

returnlablesrslist[0][

0]defmain():

trainlables = loadmnistlable("e:

\\mldataset

\\mnist

\\train-labels.idx1-ubyte")

trainimgs = loadmnistimage("e:

\\mldataset

\\mnist

\\train-images.idx3-ubyte")

testlables = loadmnistlable("e:

\\mldataset

\\mnist

\\t10k-labels.idx1-ubyte")

testimgs = loadmnistimage("e:

\\mldataset

\\mnist

\\t10k-images.idx3-ubyte")

errpredict =

0fortestimgiteminrange

(len

(testimgs)):

predictrs = getpredictlablebyknn(trainimgs, trainlables, testimgs[testimgitem], 20)

ifpredictrs != testlables[testimgitem]:

errpredict = errpredict +

1print

("err predict num=", errpredict)

if__name__ =='__main__':

main()

說明,minist資料集可以從以下**獲取

機器學習 kNN近鄰演算法

上圖中,綠色圓要被決定賦予哪個類,是紅色三角形還是藍色四方形?如果k 3,由於紅色三角形所佔比例為2 3,綠色圓將被賦予紅色三角形那個類,如果k 5,由於藍色四方形比例為3 5,因此綠色圓被賦予藍色四方形類。k最近鄰 k nearest neighbor,knn 分類演算法,是乙個理論上比較成熟的方...

機器學習 k 近鄰 kNN 演算法

一 基本原理 存在乙個樣本資料集合 也稱訓練樣本集 並且樣本集中每個資料都存在標籤。輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取樣本集中特徵最相似資料 最近鄰 的分類標籤。我們一般只選擇樣本集中前k k通常是不大於20的整數 個最相似的資料,最後選擇k個...

機器學習 k近鄰演算法 kNN

knn演算法通過計算當前測試樣本與離它最近的k個點的距離,進行投票,得到它最有可能的分類結果。首先來看看機器學習演算法的基本流程 由此可見knn演算法的特點 1.k近鄰演算法是非常特殊的,可以認為是沒有模型的演算法。2.為了和其他演算法統一,可以認為訓練資料集就是模型本身。這也是scikit lea...