K-means 算法


本學習筆記參考自吳恩達老師機器學習公開課

    聚類算法是一種無監督學習算法。k均值算法是其中應用最為廣泛的一種,算法接受一個未標記的數據集,然后將數據聚類成不同的組。K均值是一個迭代算法,假設我們想要將數據聚類成K個組,其方法為:

  1. 隨機選擇K個隨機的點(稱為聚類中心);
  2. 對與數據集中的每個數據點,按照距離K個中心點的距離,將其與距離最近的中心點關聯起來,與同一中心點關聯的所有點聚成一類;
  3. 計算每一組的均值,將該組所關聯的中心點移動到平均值的位置;
  4. 重復執行2-3步,直至中心點不再變化

算法的數學表示

算法的輸入(input):

        K – 聚類的類別數

         - 無標簽訓練集,其中每個輸入是都是一個n維的實數向量,即

假設分別表示K個類別的聚類中心,用來存儲與第i個實例數據最近的聚類中心的索引(1,2,…,k),則K-均值算法的偽代碼如下:

    算法分為2個步驟,第一個for循環是賦值步驟,即:對於每一個樣例i,計算其應該屬於的類。第二個for循環是聚類中心的移動,即:對於每一個類k,重新計算該類的質心。(注:算法執行過程中若出現沒有分配點的聚類中心,可以直接移除該聚類中心)

目標函數及其執行細節

目標函數

K均值最小化的問題,是要最小化所有數據點與其所關聯的聚類中心點之間的距離之和。因此k均值的代價函數為:

隨機初始化

K均值算法執行開始時,通常隨機初始化聚類中心點,即:隨機選擇K個訓練實例,然后令K個聚類中心分別等於這K個訓練實例。這就使得Kmeans算法存在一個缺陷:最后結果會依賴於初始化的情況,並且有可能使得代價函數停留在局部最小值處。

為了解決該問題,我們通常需要多次(50到1000次)運行K均值算法,每一次都重新進行初始化,最后再比較多次運行K-均值的結果,選擇代價函數最小的結果。通常這種方法在K較小的時候(2-10)還是可行的;但是K較大,這么做可能不會有明顯的改善,並且K較大時,通常第一次執行K均值也會得到一個不錯的結果。典型的執行次數為100次。偽代碼如下:

選擇聚類數K

        沒有所謂最好的選擇聚類數的方法,通常是需要根據不同的問題,人工的進行選擇。但是,當你想要確定最優聚類數K時,有一個值得一試的方法 - “肘部法則(Elbow method)”。該方法所做的就是不斷的改變K值(from 1 to x),執行k-均值,然后畫出代價函數與K值的變化曲線,選擇“肘點處”的值作為K的取值。如下圖:

事實上,該方法並不常用,因為大多數情況下,我們通常會得到一個光滑下降的曲線,沒有一個清晰的“肘點”,這樣就不能果斷的確定K的取值;即便若此,該方法還是值得推薦和嘗試的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM