【機器學習】機器學習建立演算法第2篇:K-近鄰演算法【附程式碼文件】

程序员一诺yinuo發表於2024-03-15

機器學習(演算法篇)完整教程(附程式碼資料)主要內容講述:機器學習演算法課程定位、目標,K-近鄰演算法,1.1 K-近鄰演算法簡介,1.2 k近鄰演算法api初步使用定位,目標,學習目標,1 什麼是K-近鄰演算法,1 Scikit-learn工具介紹,2 K-近鄰演算法API,3 案例,4 小結。K-近鄰演算法,1.3 距離度量學習目標,1 歐式距離,2 ,3 切比雪夫距離 (Chebyshev Distance):,4 閔可夫斯基距離(Minkowski Distance):,5 標準化歐氏距離 (Standardized EuclideanDistance):,6 餘弦距離(Cosine Distance),7 漢明距離(Hamming Distance)【瞭解】:,9 馬氏距離(Mahalanobis Distance)【瞭解】。K-近鄰演算法,1.4 k值的選擇學習目標。K-近鄰演算法,1.5 kd樹學習目標,1 kd樹簡介,2 構造方法,3 案例分析,4 總結。K-近鄰演算法,1.6 案例:鳶尾花種類預測--資料集介紹,1.7 特徵工程-特徵預處理學習目標,1 案例:鳶尾花種類預測,2 scikit-learn中資料集介紹,1 什麼是特徵預處理,2 歸一化,3 標準化。K-近鄰演算法,1.8 案例:鳶尾花種類預測—流程實現,1.9 練一練,1.10 交叉驗證,網格搜尋,1.11 案例2:預測facebook簽到位置學習目標,1 再識K-近鄰演算法API,2 案例:鳶尾花種類預測,總結,1 什麼是交叉驗證(cross validation),2 什麼是網格搜尋(Grid Search),3 交叉驗證,網格搜尋(模型選擇與調優)API:,4 鳶尾花案例增加K值調優,1 資料集介紹,2 步驟分析,3 程式碼過程。線性迴歸,2.1 線性迴歸簡介,2.2 線性迴歸api初步使用,2.3 數學:求導學習目標,1 線性迴歸應用場景,2 什麼是線性迴歸,1 線性迴歸API,2 舉例,1 常見函式的導數,2 導數的四則運算,3 練習,4 矩陣(向量)求導 [瞭解]。線性迴歸,2.4 線性迴歸的損失和最佳化學習目標,1 損失函式,2 最佳化演算法。線性迴歸,2.6 梯度下降法介紹,2.5 線性迴歸api再介紹學習目標,1 全梯度下降演算法(FG),2 隨機梯度下降演算法(SG),3 小批次梯度下降演算法(mini-bantch),4 隨機平均梯度下降演算法(SAG),5 演算法比較,6 梯度下降最佳化演算法(擴充)。線性迴歸,2.7 案例:波士頓房價預測學習目標,1 分析,2 迴歸效能評估,3 程式碼。線性迴歸,2.8 欠擬合和過擬合學習目標,1 定義,2 原因以及解決辦法,3 正則化,4 維災難【擴充知識】。線性迴歸,2.9 正則化線性模型,2.10 線性迴歸的改進-嶺迴歸,2.11 模型的儲存和載入,邏輯迴歸,3.1 邏輯迴歸介紹,3.2 邏輯迴歸api介紹,3.3 案例:癌症分類預測-良/惡性乳腺癌腫瘤預測學習目標,1 Ridge Regression (嶺迴歸,又名 Tikhonov regularization),2 Lasso Regression(Lasso 迴歸),3 Elastic Net (彈性網路),4 Early Stopping [瞭解],1 API,2 觀察正則化程度的變化,對結果的影響?,3 波士頓房價預測,1 sklearn模型的儲存和載入API,2 線性迴歸的模型儲存載入案例,學習目標,1 邏輯迴歸的應用場景,2 邏輯迴歸的原理,3 損失以及最佳化,1 分析,2 程式碼。邏輯迴歸,3.4 分類評估方法,3.5 ROC曲線的繪製,決策樹演算法,4.1 決策樹演算法簡介學習目標,1.分類評估方法,2 ROC曲線與AUC指標,3 總結,1 曲線繪製,2 意義解釋,學習目標。決策樹演算法,4.2 決策樹分類原理學習目標,1 熵,2 決策樹的劃分依據一------資訊增益,3 決策樹的劃分依據二----資訊增益率,4 決策樹的劃分依據三——基尼值和基尼指數。決策樹演算法,4.3 cart剪枝學習目標,1 為什麼要剪枝,2 常用的減枝方法。決策樹演算法,4.4 特徵工程-特徵提取學習目標,1 特徵提取,2 字典特徵提取,3 文字特徵提取。決策樹演算法,4.5 決策樹演算法api,4.6 案例:泰坦尼克號乘客生存預測,整合學習,5.1 整合學習演算法簡介,5.2 Bagging學習目標,1 泰坦尼克號資料,2 步驟分析,3 程式碼過程,3 決策樹視覺化,學習目標,1 什麼是整合學習,2 ,3 整合學習中boosting和Bagging,1 Bagging整合原理,2 隨機森林構造過程,3 隨機森林api介紹,4 隨機森林預測案例,5 bagging整合優點。整合學習,5.3 Boosting,聚類演算法,6.1 聚類演算法簡介,6.2 聚類演算法api初步使用,6.3 聚類演算法實現流程學習目標,1.boosting整合原理,2 GBDT(瞭解),3.XGBoost【瞭解】,4 什麼是泰勒展開式【擴充】,學習目標,1 認識聚類演算法,1 api介紹,2 案例,1 k-means聚類步驟,2 案例練習,3 小結。聚類演算法,6.4 模型評估,6.5 演算法最佳化學習目標,1 誤差平方和(SSE \The sum of squares due to error):,2 , — K值確定,3 輪廓係數法(Silhouette Coefficient),4 CH係數(Calinski-Harabasz Index),5 總結,1 Canopy演算法配合初始聚類,2 K-means++,3 二分k-means,4 k-medoids(k-中心聚類演算法),5 Kernel k-means(瞭解),6 ISODATA(瞭解),7 Mini Batch K-Means(瞭解),8 總結。聚類演算法,6.6 特徵降維,6.7 案例:探究使用者對物品類別的喜好細分降維,6.8 演算法選擇指導學習目標,1 降維,2 特徵選擇,3 主成分分析,1 需求,2 分析,3 完整程式碼。

全套筆記資料程式碼移步: 前往gitee倉庫檢視

感興趣的小夥伴可以自取哦,歡迎大家點贊轉發~


K-近鄰演算法

學習目標

  • 掌握K-近鄰演算法實現過程
  • 知道K-近鄰演算法的距離公式
  • 知道K-近鄰演算法的超引數K值以及取值問題
  • 知道kd樹實現搜尋的過程
  • 應用KNeighborsClassifier實現分類
  • 知道K-近鄰演算法的優缺點
  • 知道交叉驗證實現過程
  • 知道超引數搜尋過程
  • 應用GridSearchCV實現演算法引數的調優

1.4 k值的選擇

舉例說明:

K值過小

​ 容易受到異常點的影響

k值過大:

​ 受到樣本均衡的問題


K值選擇問題,李航博士的一書「統計學習方法」上所說:

  1. 選擇較小的K值,就相當於用較小的領域中的訓練例項進行預測,“學習”近似誤差會減小,只有與輸入例項較近或相似的訓練例項才會對預測結果起作用,與此同時帶來的問題是“學習”的估計誤差會增大,換句話說,K值的減小就意味著整體模型變得複雜,容易發生過擬合;

  2. 選擇較大的K值,就相當於用較大領域中的訓練例項進行預測,其優點是可以減少學習的估計誤差,但缺點是學習的近似誤差會增大。這時候,與輸入例項較遠(不相似的)訓練例項也會對預測器作用,使預測發生錯誤,且K值的增大就意味著整體的模型變得簡單。

  3. K=N(N為訓練樣本個數),則完全不足取,因為此時無論輸入例項是什麼,都只是簡單的預測它屬於在訓練例項中最多的類,模型過於簡單,忽略了訓練例項中大量有用資訊。

在實際應用中,K值一般取一個比較小的數值,例如採用交叉驗證法(簡單來說,就是把訓練資料在分成兩組:訓練集和驗證集)來選擇最優的K值。對這個簡單的分類器進行泛化,用核方法把這個線性模型擴充套件到非線性的情況,具體方法是把低維資料集對映到高維特徵空間。


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

估計誤差:可以理解為對測試集的測試誤差,關注測試集,估計誤差小說明對未知資料的預測能力好,模型本身最接近最佳模型。

K-近鄰演算法

學習目標

  • 掌握K-近鄰演算法實現過程
  • 知道K-近鄰演算法的距離公式
  • 知道K-近鄰演算法的超引數K值以及取值問題
  • 知道kd樹實現搜尋的過程
  • 應用KNeighborsClassifier實現分類
  • 知道K-近鄰演算法的優缺點
  • 知道交叉驗證實現過程
  • 知道超引數搜尋過程
  • 應用GridSearchCV實現演算法引數的調優

1.5 kd樹

問題匯入:

實現k近鄰法時,主要考慮的問題是如何對訓練資料進行快速k近鄰搜尋。

這在特徵空間的維數大及訓練資料容量大時尤其必要。

k近鄰法最簡單的實現是線性掃描(窮舉搜尋),即要計算輸入例項與每一個訓練例項的距離。計算並儲存好以後,再查詢K近鄰。當訓練集很大時,計算非常耗時。

為了提高kNN搜尋的效率,可以考慮使用特殊的結構儲存訓練資料,以減小計算距離的次數。


1 kd樹簡介

1.1 什麼是kd樹

根據KNN每次需要預測一個點時,我們都需要計算訓練資料集裡每個點到這個點的距離,然後選出距離最近的k個點進行投票。當資料集很大時,這個計算成本非常高,針對N個樣本,D個特徵的資料集,其演算法複雜度為O(DN^2)

kd樹:為了避免每次都重新計算一遍距離,演算法會把距離資訊儲存在一棵樹裡,這樣在計算之前從樹裡查詢距離資訊,儘量避免重新計算。其基本原理是,如果A和B距離很遠,B和C距離很近,那麼A和C的距離也很遠。有了這個資訊,就可以在合適的時候跳過距離遠的點。

這樣最佳化後的演算法複雜度可降低到O(DNlog(N))。感興趣的讀者可參閱論文:Bentley,J.L.,Communications of the ACM(1975)。

1989年,另外一種稱為Ball Tree的演算法,在kd Tree的基礎上對效能進一步進行了最佳化。感興趣的讀者可以搜尋Five balltree construction algorithms來了解詳細的演算法資訊。

1.2 原理

image-20190213191654082

黃色的點作為根節點,上面的點歸左子樹,下面的點歸右子樹,接下來再不斷地劃分,分割的那條線叫做分割超平面(splitting hyperplane),在一維中是一個點,二維中是線,三維的是面。

image-20190213191739222

黃色節點就是Root節點,下一層是紅色,再下一層是綠色,再下一層是藍色。

image-20190219101722826

1.樹的建立;

2.最近鄰域搜尋(Nearest-Neighbor Lookup)

kd樹(K-dimension tree)是一種對k維空間中的例項點進行儲存以便對其進行快速檢索的樹形資料結構。kd樹是一種二叉樹,表示對k維空間的一個劃分,構造kd樹相當於不斷地用垂直於座標軸的超平面將K維空間切分,構成一系列的K維超矩形區域。kd樹的每個結點對應於一個k維超矩形區域。利用kd樹可以省去對大部分資料點的搜尋,從而減少搜尋的計算量。

image-20190213223817957

類比“二分查詢”:給出一組資料:[9 1 4 7 2 5 0 3 8],要查詢8。如果挨個查詢(線性掃描),那麼將會把資料集都遍歷一遍。而如果排一下序那資料集就變成了:[0 1 2 3 4 5 6 7 8 9],按前一種方式我們進行了很多沒有必要的查詢,現在如果我們以5為分界點,那麼資料集就被劃分為了左右兩個“簇” [0 1 2 3 4]和[6 7 8 9]。

因此,根本就沒有必要進入第一個簇,可以直接進入第二個簇進行查詢。把二分查詢中的資料點換成k維資料點,這樣的劃分就變成了用超平面對k維空間的劃分。空間劃分就是對資料點進行分類,“捱得近”的資料點就在一個空間裡面。

2 構造方法

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

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

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

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

KD樹中每個節點是一個向量,和二叉樹按照數的大小劃分不同的是,KD樹每層需要選定向量中的某一維,然後根據這一維按左小右大的方式劃分資料。在構建KD樹時,關鍵需要解決2個問題:

(1)選擇向量的哪一維進行劃分;

(2)如何劃分資料;

第一個問題簡單的解決方法可以是隨機選擇某一維或按順序選擇,但是更好的方法應該是在資料比較分散的那一維進行劃分(分散的程度可以根據方差來衡量)。好的劃分方法可以使構建的樹比較平衡,可以每次選擇中位數來進行劃分,這樣問題2也得到了解決。

3 案例分析

3.1 樹的建立

給定一個二維空間資料集:T={(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},構造一個平衡kd樹。

image-20190219102142984

(1)思路引導:

根結點對應包含資料集T的矩形,選擇x(1)軸,6個資料點的x(1)座標中位數是6,這裡選最接近的(7,2)點,以平面x(1)=7將空間分為左、右兩個子矩形(子結點);接著左矩形以x(2)=4分為兩個子矩形(左矩形中{(2,3),(5,4),(4,7)}點的x(2)座標中位數正好為4),右矩形以x(2)=6分為兩個子矩形,如此遞迴,最後得到如下圖所示的特徵空間劃分和kd樹。

image-20190219102409567

3.2 最近領域的搜尋

假設標記為星星的點是 test point, 綠色的點是找到的近似點,在回溯過程中,需要用到一個佇列,儲存需要回溯的點,在判斷其他子節點空間中是否有可能有距離查詢點更近的資料點時,做法是以查詢點為圓心,以當前的最近距離為半徑畫圓,這個圓稱為候選超球(candidate hypersphere),如果圓與回溯點的軸相交,則需要將軸另一邊的節點都放到回溯佇列裡面來。

image-20190213224152601

樣本集{(2,3),(5,4), (9,6), (4,7), (8,1), (7,2)}

3.2.1 查詢點(2.1,3.1)

image-20190213224414342

在(7,2)點測試到達(5,4),在(5,4)點測試到達(2,3),然後search_path中的結點為<(7,2),(5,4), (2,3)>,從search_path中取出(2,3)作為當前最佳結點nearest, dist為0.141;

然後回溯至(5,4),以(2.1,3.1)為圓心,以dist=0.141為半徑畫一個圓,並不和超平面y=4相交,如上圖,所以不必跳到結點(5,4)的右子空間去搜尋,因為右子空間中不可能有更近樣本點了。

於是再回溯至(7,2),同理,以(2.1,3.1)為圓心,以dist=0.141為半徑畫一個圓並不和超平面x=7相交,所以也不用跳到結點(7,2)的右子空間去搜尋。

至此,search_path為空,結束整個搜尋,返回nearest(2,3)作為(2.1,3.1)的最近鄰點,最近距離為0.141。

3.2.2 查詢點(2,4.5)

image-20190219103050940

在(7,2)處測試到達(5,4),在(5,4)處測試到達(4,7)【優先選擇在本域搜尋】,然後search_path中的結點為<(7,2),(5,4), (4,7)>,從search_path中取出(4,7)作為當前最佳結點nearest, dist為3.202;

然後回溯至(5,4),以(2,4.5)為圓心,以dist=3.202為半徑畫一個圓與超平面y=4相交,所以需要跳到(5,4)的左子空間去搜尋。所以要將(2,3)加入到search_path中,現在search_path中的結點為<(7,2),(2, 3)>;另外,(5,4)與(2,4.5)的距離為3.04 < dist = 3.202,所以將(5,4)賦給nearest,並且dist=3.04。

回溯至(2,3),(2,3)是葉子節點,直接平判斷(2,3)是否離(2,4.5)更近,計算得到距離為1.5,所以nearest更新為(2,3),dist更新為(1.5)

回溯至(7,2),同理,以(2,4.5)為圓心,以dist=1.5為半徑畫一個圓並不和超平面x=7相交, 所以不用跳到結點(7,2)的右子空間去搜尋。

至此,search_path為空,結束整個搜尋,返回nearest(2,3)作為(2,4.5)的最近鄰點,最近距離為1.5。

4 總結

首先透過二叉樹搜尋(比較待查詢節點和分裂節點的分裂維的值,小於等於就進入左子樹分支,大於就進入右子樹分支直到葉子結點),順著“搜尋路徑”很快能找到最近鄰的近似點,也就是與待查詢點處於同一個子空間的葉子結點;

然後再回溯搜尋路徑,並判斷搜尋路徑上的結點的其他子結點空間中是否可能有距離查詢點更近的資料點,如果有可能,則需要跳到其他子結點空間中去搜尋(將其他子結點加入到搜尋路徑)。

重複這個過程直到搜尋路徑為空。

未完待續, 同學們請等待下一期

全套筆記資料程式碼移步: 前往gitee倉庫檢視

感興趣的小夥伴可以自取哦,歡迎大家點贊轉發~

相關文章