機器學習——KNN(K近鄰)

SongpingWang發表於2018-05-28

K近鄰(KNN)K Nearest Neighbors

     
~~~~~
有監督學習 無監督學習
樣本 必須要有訓練集與測試樣本。在訓練集中找規律,而對測試樣本使用這種規律。 沒有訓練集,只有一組資料,在該組資料集內尋找規律。
目標 方法是識別事物,識別的結果表現在給待識別資料加上了標籤。因此訓練樣本集必須由帶標籤的樣本組成。 方法只有要分析的資料集的本身,預先沒有什麼標籤。 如果發現資料集呈現某種聚集性,則可按自然的聚集性分類,但不予以某種預先分類標籤對上號為目的。
(1)無監督學習是在尋找資料集中的規律性,這種規律性並不一定要達到劃分資料集的目的,也就是說不一定要“分類”。
    這一點是比有監督學習方法的用途要廣。譬如分析一堆資料的主分量,或分析資料集有什麼特點都可以歸於
    非監督學習方法的範疇。

(2)用非監督學習方法分析資料集的主分量與用K-L變換計算資料集的主分量又有區別。後者從方法上講不是學習方法。
    因此用K-L變換找主分量不屬於無監督學習方法,即方法上不是。而通過學習逐漸找到規律性這體現了學習方法這一點。
    在人工神經元網路中尋找主分量的方法屬於無監督學習方法。
       
~~~~~~~
監督學習 強化學習
反饋對映 都會學習出輸入到輸出的一個對映,監 督式學習出的是之間的關係,可以告訴 演算法什麼樣的輸入對應著什麼樣的輸出。 強化學習出的是給機器的反饋 reward function,即用來判斷這個行為是好是壞。
反饋時間 做了比較壞的選擇會立刻反饋給演算法。 結果反饋有延時,有時候可能需 要走了很多步以後才知道以前的 某一步的選擇是好還是壞。
輸入特徵 輸入是獨立同分布的。 面對的輸入總是在變化,每當算 法做出一個行為,它影響下一次 決策的輸入。
行為模式 不考慮行為間的平衡,只是 exploitative。 一個 agent 可以在探索和開發(exploration and exploitation)之間做權衡,並且選擇一個最大的 回報。 exploration 會嘗試很多不同的事情,看它們是否 比以前嘗試過的更好。 exploitation 會嘗試過去經驗中最有效的行為。

一. 什麼是K近鄰

思想:只要知道你朋友(鄰居)是什麼人,就能知道你是什麼人
K近鄰是一種 懶惰的學習方法:(基於例項學習)

Lazy learners: instance-based learning

新資料來時,才開始學習給出分類
KNN 沒有訓練模型,訓練和預測結合一起

這裡寫圖片描述

二 . K近鄰的距離度量公式

距離(distance)--衡量樣本之間的相相識度
歐式距離(平面幾何之間的距離)
曼哈頓距離(兩點之間X的距離+Y的距離:類似樓梯鋪紅毯,紅毯的長度)
閔氏距離(閔可夫斯基距離)

通用距離公式 ( 閔氏距離 )

D(X,Y)=i=1n|XiYi|pp
D(X,Y)=\sqrt[p]{\sum _{i=1}^n|X_i-Y_i|^p}

p=1
p = 1
為曼哈頓距離:D(X,Y)=i=1n|XiYi|
D(X,Y)={\sum _{i=1}^n|X_i-Y_i|}

p=2
p = 2
為歐式距離:D(X,Y)=i=1n(XiYi)2
D(X,Y)=\sqrt[]{\sum _{i=1}^n(X_i-Y_i)^2}

三. K值選擇

3.1 近似誤差(訓練集誤差)與 估計誤差(測試集誤差)
近似誤差:對現有訓練集的訓練誤差,關注訓練集,如果近似誤差過小可能會出現過擬合的現象,
         對現有的訓練集能有很好的預測,但是對未知的測試樣本將會出現較大偏差的預測。
         模型本身不是最接近最佳模型

估計誤差:可以理解為對測試集的測試誤差,關注測試集,估計誤差小說明對未知資料的預測能力好,
         模型本身最接近最佳模型。
3.2 K值確定標準:
K值過小:k值小,特徵空間被劃分為更多子空間(模型的項越多),整體模型變複雜,容易過擬合,
        k值越小,選擇的範圍就比較小,訓練的時候命中率較高,近似誤差小,
        而用test的時候就容易出錯,估計誤差大,容易過擬合。

K值=N: 無論輸入例項是什麼,都將簡單的預測他屬於訓練例項中最多的類

這裡寫圖片描述
K近鄰演算法基本流程

    開始
    指定K值
    計算輸入樣本與訓練樣本之間的距離
    按距離排序
    篩選K個最近鄰居
    投票判斷分類
    結束

四 kd-tree (k-dimensional樹)

4.1 原理
一種分割k維資料空間的資料結構。應用於多維空間關鍵資料搜尋(如:範圍和最近鄰搜尋)。

kd樹是是一種二叉樹,表示對k維空間的一個劃分,構造kd樹相當於不斷地用垂直於座標軸的超平面
    將K維空間切分,構成一系列的K維超矩形區域。kd樹的每個結點對應於一個k維超矩形區域。
    利用kd樹可以省去對大部分資料點的搜尋,從而減少搜尋的計算量。

這裡寫圖片描述

4.2 構造方法
(1)構造根結點,使根結點對應於K維空間中包含所有例項點的超矩形區域;

(2)通過遞迴的方法,不斷地對k維空間進行切分,生成子結點。在超矩形區域上選擇一個座標軸和
     在此座標軸上的一個切分點,確定一個超平面,這個超平面通過選定的切分點並垂直於選定的座標軸,
     將當前超矩形區域切分為左右兩個子區域(子結點);這時,例項被分到兩個子區域

(3)上述過程直到子區域內沒有例項時終止(終止時的結點為葉結點)。在此過程中,將例項儲存在相應的結點上。

(4)通常,迴圈的選擇座標軸對空間切分,選擇訓練例項點在座標軸上的中位數為切分點,
    這樣得到的kd樹是平衡的(平衡二叉樹:它是一棵空樹,或其左子樹和右子樹的深度之差的絕對值不超過1,
    且它的左子樹和右子樹都是平衡二叉樹)。 

    注意:平衡的kd樹搜尋時的效率未必是最低的。特殊情況有時在稀疏點切

這裡寫圖片描述

五. K近鄰演算法程式碼

sklearn.neighbors  KNeighborsClassifier
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(
                            n_neighbors = 5,
                            weights = 'uniform',
                            algorithm = 'auto',
                            leaf_size = 30,
                            p = 2,
                            metric = 'minkowski',
                            metric_param = None,
                            n_jobs = 1
                            )
一些重要的引數:
n_neighbors --K值
weights     --鄰居權重,uniform鄰居一樣大/distance距離小權重大
metric_param--距離計算公式   minkowski閔氏距離
p           ---閔氏距離引數  p = 1(曼哈頓距離) p = 2(歐式距離)

六. K近鄰模型優化

6.1 K值
    K過小(理論最小=1)也就是鄰居數為1,會受到噪聲資料影響,降低分類精度
    K過大(理論=訓練樣本數)會受到不相關資料影響,降低分類精度
使用交叉驗證尋找最好的K值
經驗值 k = sqr(n)/2, n時訓練樣本數
6.2 選擇距離格式:
6.3 K 近鄰投票加權方法
平均加權    uniform 與鄰居一樣大
距離加權    distance 距離小權重大
用強大的 Gridsearch(網格搜尋)尋找最優引數
parameters = {
                'n_neighbors':[5,10,15,20,30],
                'weights':['uniform','distance'],
                'p':[1,2]
             }
knn = KNeighborsClassifier()
grid_search = GridSearchCV(lnn,parameters,scoring = 'accuracy',cv = 5)
grid_search.fit(x,y)

相關文章