一些前提的約定,還是沿用上篇文章的哈。先來致敬下男神。
一: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和後台進行互動大部分用的...