之前講解的線性回歸和邏輯回歸的原理中,不免會引入大量的數學推導和證明過程,從預測函數的建立,到損失函數的偏導數求解,不免要求讀者有扎實的高等數學功底和線性代數功底,那么機器學習里有沒有稍微大眾化,通俗易懂的算法呢?KNN算法就是最淺顯易懂的算法之一
假設我們有蘋果,橙子,香蕉三類水果,你希望記錄這三類的特征數據,比如最基本的長度、寬度、高度、重量、周長、體積、光澤度、濕度等量化的物理量,然后統計出一份含有這些物理量的樣品表,其中每一行代表一個水果,你可以很容易的為每一行打上水果標簽,然后你希望寫出某個算法,在當你得到一個未知水果時,通過算法和統計的樣本表,根據每個水果都有的物理量來自動推理出這個未知的水果屬于哪一類水果?
顯然,這是一個分類算法,并且屬于監督學習,KNN算法就是其中最典型最容易實現的算法
本章知識點:
1、數據在不同維度上分布的分類表現
2、KNN算法的思想
3、數據歸一化處理
4、找鄰居
5、投票決定
6、監督學習的過程
7、KNN的優缺點
從知識點可以看出,KNN算法并沒有涉及到高等數學的推導過程,這個算法非常人性,非常簡單
一. 數據在不同維度上分布的分類表現
假設我們的樣本集是由蘋果,橙子,香蕉這3個類別組成,其中每個樣本有4個量化物理維度
我們從采集到的樣本集合里可以知道,每一行4個維度代表一個樣本,并且最后一列表明了樣本的類別,這就是典型的監督學習樣本,我們以這個樣本為參考系,通過算法來預測未知樣本。
我們先用二維空間為參考系,選取樣本的第一維和第四維來繪制樣本集
從第一維和第四維分布上我們看到這三類分類除了顏色區分,離散度是較高的,我們再選擇第一維和第三維來繪制
從第一維和第三維分布上我們可以看到分類效果稍微比前面的清楚一點(沒有那么離散)
下面我們用三維空間為參考系,選取樣本的第一維,第二維,第三維來繪制樣本集
可以看出它的廬山真面目,分類效果更加明顯,那么四維空間上的分布呢?對不起,人類無法看到高維空間
二. KNN算法的思想
KNN(k-NearestNeighbor)又被稱為近鄰算法,它的核心思想是:物以類聚,人以群分
假設一個未知樣本數據x需要歸類,總共有ABC三個類別,那么離x距離最近的有k個鄰居,這k個鄰居里有k1個鄰居屬于A類,k2個鄰居屬于B類,k3個鄰居屬于C類,如果k1>k2>k3,那么x就屬于A類,也就是說x的類別完全由鄰居來推斷出來
所以我們可以總結出其算法步驟為:
1、計算測試對象到訓練集中每個對象的距離
2、按照距離的遠近排序
3、選取與當前測試對象最近的k的訓練對象,作為該測試對象的鄰居
4、統計這k個鄰居的類別頻率
5、k個鄰居里頻率最高的類別,即為測試對象的類別
我們可以簡化為:找鄰居 + 投票決定
三. 數據歸一化
有了算法的思想,首先我們要做的是將采集到的樣本集做歸一化處理
因為不同維度的物理量之間往往具有不同的量綱和單位,比如時間,距離等,這樣會造成維度之間可比性較差,為了消除物理量之間絕對值相差太大,需要對樣本數據集進行標準化處理,保證各個物理量之間處于同一個數量級之下,消除不同量綱之間的差異,一般有如下兩個常用的歸一化方法:
1、線性歸一化(Min-Max scaling)
該方法通過線性變化對原始數據進行等比例縮放映射到[0,1]之間,其中X*為歸一化后的數據,X為原始數據,Xmin和Xmax分別為X向量的最小值和最大值
2、0均值標準化(Z-score standardization)
該方法將原始數據歸一化為均值為0、方差為1的數據集,且該數據集符合標準的高斯分布,其中X*為歸一化后的數據,X為原始數據,μ為X向量的均值,σ為X向量的標準差
四. 找鄰居
設x為TestSet的一個n維向量樣本,我們需要在TrainSet中找到距離x最近的k個n維向量樣本作為x的鄰居,那么問題轉化為怎么計算多組兩個n維向量之間的距離?
一般對于兩個n維向量,如果是直接物理量,可以用歐氏距離、曼哈頓距離等來計算這兩個n維向量之間的距離;而對于文本分類而言,一般會使用余弦定理來計算這兩個n維向量之間的夾角來確定相似度
在這里,我們采用歐式距離來計算,設y為TrainSet中任意一個n維向量樣本,則x和y之間的距離可以表示為:
我們需要分別計算x到TrainSet中所有樣本的距離,并對這些距離從小到大排序,選取前k個距離的樣本就找到了x的k個鄰居(物以類聚的思想)
其中k值的設定一般低于樣本數量的平方根,且為奇數最適宜
五. 投票決定
我們得到x的k個鄰居后,需要統計這k個鄰居的類別頻率,已少數服從多數的原則,同一類別最多的鄰居,即作為x的類別(x的類別完全由鄰居來投票推斷)
六. KNN監督學習的過程
我們將樣本集劃分為25%的測試集和75%的訓練集,以5個鄰居為例運行算法得到下面結果
可以看到算法只預測錯了1個樣本的分類,準確率達到90%以上
以KNN算法為例,我們可以總結出監督學習的基本流程
1、歸一化數據樣本集
2、劃分樣本集為訓練集和測試集
3、以訓練集為算法參考系,測試集來測試算法
4、計算預測樣品標簽和真實樣品標簽的比值來評估算法的準確率
5、調節不同的參數找到最優算法參數
7. KNN算法的優缺點
1、優點
非常簡單的分類算法沒有之一,人性化,易于理解,易于實現
適合處理多分類問題,比如推薦用戶
2、缺點
屬于懶惰算法,時間復雜度較高,因為需要計算未知樣本到所有已知樣本的距離
樣本平衡度依賴高,當出現極端情況樣本不平衡時,分類絕對會出現偏差
可解釋性差,無法給出類似決策樹那樣的規則
向量的維度越高,歐式距離的區分能力就越弱
KNN算法案例代碼見:KNN算法的基本原理