機器學習實戰(zhàn)ByMatlab(1):KNN算法原文出處: Liu_LongPo的專欄(@Liu_LongPo) 歡迎分享原創(chuàng)到伯樂頭條 KNN 算法其實簡單的說就是“物以類聚”,也就是將新的沒有被分類的點分類為周圍的點中大多數(shù)屬于的類。它采用測量不同特征值之間的距離方法進行分類,思想很簡單:如果一個樣本的特征空間中最為臨近(歐式距離進行判斷)的K個點大都屬于某一個類,那么該樣本就屬于這個類。這就是物以類聚的思想。 當然,實際中,不同的K取值會影響到分類效果,并且在K個臨近點的選擇中,都不加意外的認為這K個點都是已經(jīng)分類好的了,否則該算法也就失去了物以類聚的意義了。 KNN算法的不足點: 1、當樣本不平衡時,比如一個類的樣本容量很大,其他類的樣本容量很小,輸入一個樣本的時候,K個臨近值中大多數(shù)都是大樣本容量的那個類,這時可能就會導致分類錯誤。改進方法是對K臨近點進行加權(quán),也就是距離近的點的權(quán)值大,距離遠的點權(quán)值小。 2、計算量較大,每個待分類的樣本都要計算它到全部點的距離,根據(jù)距離排序才能求得K個臨近點,改進方法是:先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本。 適用性: 適用于樣本容量比較大的類域的自動分類,而樣本容量較小的類域則容易誤分 算法描述: 1、計算已知類別數(shù)據(jù)集合匯總的點與當前點的距離 Python 實現(xiàn)
調(diào)用方式:
Matlab 實現(xiàn) 這里以一個完整實例呈現(xiàn),代碼如下:
可以看到,整個KNN算法的Matlab代碼也就只有6行,比Python少很多,這其中要得益于Matlab成熟的矩陣計算和很多成熟的函數(shù)。 實際調(diào)用中,我們利用一個數(shù)據(jù)集進行測試,該數(shù)據(jù)集是由1000個樣本的3維坐標組成,共分為3個類 首先可視化我們的數(shù)據(jù)集,看看它的分布: 第一維和第二維:可以清晰地看到數(shù)據(jù)大致上分為 3 類
第1維和第3維:從這個角度看,3類的分布就有點重疊了,這是因為我們的視角原因
畫出3維,看看它的廬山真面目:
由于我們已經(jīng)編寫了KNN代碼,接下來我們只需調(diào)用就行。了解過機器學習的人都應該知道,很多樣本數(shù)據(jù)在代入算法之前都應該進行歸一化,這里我們將數(shù)據(jù)歸一化在[0,1]的區(qū)間內(nèi),歸一化方式如下: newData = (oldData-minValue)/(maxValue-minValue) 其中,maxValue為oldData的最大值,minValue為 oldData 的最小值。 同時,我們對于1000個數(shù)據(jù)集,采取10%的數(shù)據(jù)進行測試,90%的數(shù)據(jù)進行訓練的方式,由于本測試數(shù)據(jù)之間完全獨立,可以隨機抽取10%的數(shù)據(jù)作為測試數(shù)據(jù),代碼如下:
當我們選擇K為4的時候,準確率為:97% KNN進階 接下來我們將運用KNN算法實現(xiàn)一個手寫識別系統(tǒng),訓練數(shù)據(jù)集大約2000個樣本,每個數(shù)字大概有200個樣本
由于數(shù)據(jù)量比較大,加載數(shù)據(jù)的時候回花一點時間,具體代碼如下:
不同的K識別準確率稍有不同,當K為4的時候,準確率為 98.31% |
|
|