1. K-Means原理解析
2. K-Means的優化
3. sklearn的K-Means的使用
4. K-Means和K-Means++實現
1. 前言
我們在一開始的時候應該就說過,機器學習按照有無標簽可以分為“監督學習”和“非監督學習”。
監督學習里面的代表算法就是:SVM、邏輯回歸、決策樹、各種集成算法等等。
非監督學習主要的任務就是通過一定的規則,把相似的數據聚集到一起,簡稱聚類。我們今天講的K-Means算法是在非監督學習比較容易理解的一個算法,也是聚類算法中最著名的算法。
2. K-Means原理
K-Means是典型的聚類算法,K-Means算法中的k表示的是聚類為k個簇,means代表取每一個聚類中數據值的均值作為該簇的中心,或者稱為質心,即用每一個的類的質心對該簇進行描述。
2.1 K-Means步驟
- 創建k個點作為起始質心。
- 計算每一個數據點到k個質心的距離。把這個點歸到距離最近的哪個質心。
- 根據每個質心所聚集的點,重新更新質心的位置。
- 重復2,3,直到前后兩次質心的位置的變化小於一個閾值。
整個變化的過程如果用圖呈現出來會形象很多,下面的圖就是k=2的K-Means的過程:
2.2 K值的確定
K-Means算法一般都只有一個超參數,就是K。那我們拿到一個數據后,要吧數據分成幾類呢?我們就來討論下這個問題。
- 首先一個具體的問題肯定有它的具體的業務場景,K值需要根據業務場景來定義。
- 如果業務場景無法確定K值,我們也有技術手段來找一個合適的K。這個方法就是手肘法。
2.3 手肘法
K-Means算法中每一步都可以計算出loss值又稱為SSE。loss值的計算方式就是每個聚類的點到它們質心的距離的平方。
指定一個Max值,即可能的最大類簇數。然后將類簇數K從1開始遞增,一直到Max,計算出Max個SSE。根據數據的潛在模式,當設定的類簇數不斷逼近真實類簇數時,SSE呈現快速下降態勢,而當設定類簇數超過真實類簇數時,SSE也會繼續下降,當下降會迅速趨於緩慢。通過畫出K-SSE曲線,找出下降途中的拐點,即可較好的確定K值。
這樣手肘圖的拐點應該是k=4的時候,所以我們可以定k=4的時候聚類效果比較好。
3. K-Means與KNN
初學者很容易把K-Means和KNN搞混,兩者其實差別還是很大的。
K-Means是無監督學習的聚類算法,沒有樣本輸出;而KNN是監督學習的分類算法,有對應的類別輸出。KNN基本不需要訓練,對測試集里面的點,只需要找到在訓練集中最近的k個點,用這最近的k個點的類別來決定測試點的類別。而K-Means則有明顯的訓練過程,找到k個類別的最佳質心,從而決定樣本的簇類別。
當然,兩者也有一些相似點,兩個算法都包含一個過程,即找出和某一個點最近的點。兩者都利用了最近鄰(nearest neighbors)的思想。
4. 總結
K-Means的原理是很簡單,但是我們仔細想想我們處理K-Means的思想好想和別的方法不太一樣。我們是先去猜想我們想要的結果,然后根據這個猜想去優化損失函數,再重新調整我們的猜想,一直重復這兩個過程。
其實這個猜想就是我們要求出的隱藏變量,優化損失函數的過程,就是最大化釋然函數的過程。K-Means的算法就是一個EM算法的過程。