每天進步一點點《ML KNN》

2021-10-09 18:32:53 字數 3929 閱讀 9404

一些前提的約定,還是沿用上篇文章的哈。先來致敬下男神。

一:k最近鄰(knn)

knn是乙個監督學習方法,也是一種分類演算法。這一篇比較簡單,這是個比較古老的演算法,其思想也是很簡單樸素的,已知我們有一堆樣本,都是已經分好了類,每樣本都是有個標籤的,代表了該樣本是屬於哪個類別。

knn的思想就是,好了,我有一堆的樣本,我也不管別的,你給我乙個新的不帶標籤的樣本a讓我分類,我就用已有的分好類的樣本集合去匹配。計算新的樣本a到每乙個已經分配好的樣本b之間的距離,看看距離樣本a最近最近的前k個樣本的標籤是什麼,在前k個樣本中找到最多的樣本的標籤就認為是該新樣本的標籤,分類結束。

把到所有點的距離按照從小到大的順序進行排序,找到最近的前k的距離對應的樣本以及對應的標籤,對每個標籤進行統計數量,選最數量最大的那個標籤作為未知樣本的分類標籤和類別。

二:舉例實踐

途中紅色是乙個類別:0,藍色是乙個類別:1,對綠色標籤進行分類。

我們選取k= 5,在前5個樣本中進行選擇。

clear all

clcsrc_x1 =

[1.3

,1.35

,1.4

,1.45

,1.5

,1.32

,1.33

,1.42

,1.43

,1.46];

src_y1 =

[3.32

,3.15

,3.12

,3.41

,3.26

,3.3

,3.5

,3.2

,3.4

,3.6];

src_x2 =

[3.3

,3.35

,3.4

,3.45

,3.5

,3.32

,3.352

,3.42

,3.47

,3.52];

src_y2 =

[5.3

,5.5

,5.2

,5.4

,5.6

,5.32

,5.35

,5.24

,5.34

,5.61];

src_x =

[src_x1, src_x2]';

src_y =

[src_y1, src_y2]';

tag =

[ones(1

,size

(src_x1)(2

)),zeros(1

,size

(src_x2)(2

))];

% random to form some data

traindata =

[src_x, src_y]

;trainclass = tag';

testdata =

[3.0

,3.7];

figure()

;subplot(1

,1,1

);hold on;

% 打點,畫決策邊界

看來他是分類到了1這個標籤,因為前五個標籤中有三個是1,,佔了多數。

三:進一步學習

1:knn受k影響大。要選擇合適的k值,k值不同,可能直接贏分類的結果。可以不斷地調整k值,對進行交叉驗證,選擇餓乙個誤差最小的k值。

k值過小,那麼模型就會變得複雜,容易導致過擬合,假設k=1,那就是找到離自己最近的樣本所在的類別,容易受到雜訊干擾,還會受到異常點的干擾。之所以變得複雜呢是因為,整個空間按照距離的劃分,就分成了很多個特別複雜的區域,某個區域內的點屬於某個樣本,另外個區域內的屬於另外個樣本。比如下圖,整個空間被兩個樣本劃分了兩個區域。大家可以在整個特徵空間內找到很多點,都去計算下他英國屬於的樣本空間,在圖中畫出來就是乙個很複雜的多區域。

如果k過大,整個模型又太簡單,假設k=n,是全部訓練樣本空間的樣本數量,那麼最後整個分類就是簡單的樣本空間誰最多就是誰。也就是著呢個空間區域全部都是樣本多的那個類別的區域範圍,這時候就是高偏差就出現了。

它太多簡單了。。。。

每天進步一點點

很多朋友總喜歡問 成功靠什麼?其實,成功很難單一的歸納為靠什麼條件,如果一定要回答,只能從某種意義上說 很多人的成功就是靠他們每天比別人 多做一點點 正如古人有云 業精於勤,荒於嬉。這裡所說的勤,也就是比別人多做一點點,即付出多一點的勞動和努力。不要小看這一點點,又如古語說 集腋成裘,積沙成丘。如果...

每天進步一點點

在模組化程式設計時,在子模組中宣告變數 例如unsigned char aa 不需要在標頭檔案中宣告 要在主函式中呼叫,要寫成 extern unsigned char aa 而不能寫成 extern aa 寫成extern aa 則無法改變aa的值。2014年9月22日 21 12 00 品質因數...

每天進步一點點(一)

最近接了第乙個商業專案,一人獨立完成從前台到後台,做了有幾天的時間,每天進步一點點,把每天看到的學到的記錄下來,以後也堅持。後台繼續用自己的extjs老本行,因為相比其他js庫,extjs用的比較熟,現成的 也有所以開發起來也比較容易,今天學到了兩個ext的新東西。一 ext和後台進行互動大部分用的...