機器學習實戰1 K近鄰演算法(KNN)

2021-08-07 05:50:52 字數 3158 閱讀 6498

knn(k nearest neighbors)演算法,也叫k最近鄰演算法。主要思想是,如果乙個樣本在特徵空間中的k個最相似(或最鄰近)的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。

例如,村里投票建水井,有三個選址a, b和c,所有的人家都投了票,除了李四家。村書記決定找出距李四家最近的6戶人家,發現3戶投了b,2戶投了a,1戶投了c。於是村書記決定給李四家的投票結果標記為b。

問題的一般化:有n個已標記樣本,

,現需要對新來的資料xn

+1做標記。

knn演算法的思路:找出n個樣本裡離xn

+1最近的k個樣本,統計這k個樣本裡類別yi

出現次數最多的樣本,將新樣本xn

+1標記為yi

類。有a, b, c, d四個座標點,其座標分別為:a(1,1.1),b(1,1),c(0,0.1),c(0,0)。其中a和b兩個點標記為紅色類,記為r類;c和d兩個點標記為綠色類,標記為g類。現在另有乙個點e(0.2, 0.2),圖中用藍色標記。請問點e屬於r類還是g類?

輸入的樣本

需要得到的結果:點e

(0.2

,0.2

) 的類別

演算法的偽**

1. 分別計算點e到點a, b, c, d的距離: re

a , re

b , re

c , re

d .

2. 將這四個距離值由小到大排序,re

c d

b a

3. 假定k=

3 ,則距離e點最近的三個點依次為:c, d, b

4. 統計這三個點的類別,分別為:g, g, r。即g類出現2次,r類出現1次。統計列表為

5. 輸出點e的類別:g。即點e屬於綠色類g。

#!/usr/bin/env python
from numpy import *

import operator

defcreatedataset

():#輸入帶標記的樣本

group = array([[1.0,1.1], [1.0,1.0],[0,0],[0,0.1]])

labels = ['r','r','g','g']

return group, labels

#use knn to classify

defclassify

(input, dataset, label, k):

#input是待分類的樣本,這裡是點e的座標;dataset是帶標記樣本,即createdataset()返回的group;label是createdataset()返回的labels,k是設定的值,找最近的k個鄰居

datasize = dataset.shape[0] #array.shap[0]返回矩陣array的行數

#calculate the distance

diff = tile(input, (datasize,1)) - dataset # 參見tile函式的用法

sqdiff = diff ** 2

# 算diff的平方

squaredist = sum(sqdiff, axis=1) #將矩陣的每一行相加

dist = squaredist ** 0.5

# 開平方

#sort the distance

sorteddistindex = argsort(dist) # 將dist按公升序排序,返回其下標

classcount = {} # 建立字典classcount

for i in range(k):

votelabel = label[sorteddistindex[i]] # 通過下標找到對應的label

classcount[votelabel] = classcount.get(votelabel,0) + 1

# 將label對應的計數加一,沒找到label就置預設值0

maxcount = 0

# 統計出現次數最多的類別

for key,value in classcount.items():

if value > maxcount:

maxcount = value

classes = key

return classes

group, labels = createdataset()

input = array([0.2,0.2])

output = classify(input, group, labels, 3)

print("input is:", input, "result is:", output)在命令列中輸入:python knn.py

輸出結果:

(『input is:』array([0.2, 0.2]), 『result is:』, 『g』)

輸入矩陣[0.2,0.2]

datasize=4為樣本dataset=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])的行數

將[0.2,0.2]在行的緯度上重複4次,變成array([[0.2,0.2],[0.2,0.2],[0.2,0.2],[0.2,0.2]])

得到diff=array([[-0.8,-0.9],[-0.8,-0.8],[0.2,0.2],[0.2,0.1]])

sqdiff=array([[0.64,0.81],[0.64,0.64],[0.04,0.04],[0.04,0.01]])

squaredist=array([1.45,1.28,0.08,0.05])

dist=array([1.2,1.13,0.28,0.22])

sorteddistindex=array([3,2,1,0])

classcount =

結果返回g

機器學習實戰 1 K近鄰

1.np.tile array,行重複次數,列重複次數 a np.array 1,2,3 b np.tile a,2,3 b 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 2.array.sum axis 0 1 0 每列求和 1 沒行求和 3.array.argsort ...

機器學習實戰筆記1 K近鄰演算法詳解

最近在看 機器學習實戰 這本書,書中的 都是對某種演算法在對應應用場景的實現,感覺比大學時代的資料結構或者演算法題還要晦澀難懂,只能慢慢學習了,演算法這種東西類似做數學題,要多做多練。k 近鄰演算法乙個典型的應用場景就是在區別電影類別中,比如說根據在電影片段中出現親吻,打 鬥場景來判斷電影是否是愛情...

機器學習實戰 KNN演算法(K近鄰)

演算法實現 演算法應用舉例 k近鄰演算法是機器學習最簡單的演算法之一,也是機器學習的初步,其主要通過大量的資料分析,判斷一組未知資料和各資料的距離,從而對一組未知資料進行相應的歸類。而所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。所以knn演算法並不是十分完...