1. 程式人生 > >我眼裏K-Means算法

我眼裏K-Means算法

開始 接下來 它的 講解 .com 情況 一個點 size 算法

在我眼裏一切都是那麽簡單,復雜的我也看不懂,最討厭那些復雜的人際關系,唉,像孩子一樣交流不好嗎。

學習K-Means算法時,會讓我想起三國誌這個遊戲,界面是一張中國地圖,諸侯分立,各自為據。但是遊戲開始,玩家會是一個人一座城池(我比較喜歡這樣,就有挑戰性),然後不斷的征戰各方,占領城池

不斷的擴大地盤,正常來說,征戰的城池是距離自己較為近的,然後選擇這些城池的中心位置作為主城。所以過來一段時間後,地圖上就會出現幾個主要的勢力範圍,三足鼎立正是如此。這個過程和K-Means算法十分相似。

接下來我們以下圖為遊戲地圖為例來講解K-Means算法,地圖中的每一個城池為一個數據樣例(包含城池的坐標),假如遊戲開始設定三個遊戲玩家(三個聚類中心K),遊戲目的希望最後三個玩家各自為據形成右圖的格局。開始遊戲!

技術分享圖片 技術分享圖片

K-Means(k均值算法):

一開始先要介紹算法的整體流程

(1)隨機初始化聚類中心的位置

(2)計算每一個點到聚類中心的距離,選取最小值分配給k(i)

  技術分享圖片

(3)移動聚類中心(其實就是對所屬它的樣本點求平均值,就是它移動是位置)

  技術分享圖片

(4)重復(2),(3)直到損失函數(也就是所有樣本點到其所歸屬的樣本中心的距離的和最小)

最後整體分類格局會變得穩定。

優化目標,也就是之前我們經常提到的損失函數

  技術分享圖片

在不斷的循環過程中,聚類中心也在不斷地更新,直到上式距離總和收斂精確值的時候,獲得最優解。

(1) 隨機初始化

  為了遊戲的公平性,使用隨機的方式把三個遊戲玩家分配到地圖上三個城池中(這裏需要註意聚類中心的個數一定要小於數據樣本的個數)。隨機初始化會遇見下面幾種情況

  1 好的情況

  技術分享圖片

  這種情況最為好,因為三個聚類中心已經很好的散布在三個主要的樣本類上,再執行下面的算法就可以形成我們想要的分類。

2

  技術分享圖片

  這種情況就不太好,紅點和綠點一開始就分配在以起,所以一開就會產生對立,對於不好的初始化可能會產生以下聚類結果

  技術分享圖片

  這種情況就是就很糟糕了,不符合要求。

  對於這種情況我們沒有很好的解決辦法,可以嘗試多次初始化,獲取最好的結果,例如設置1000次隨機初始化,選取損失函數值最小的一個。

還有一種情況,對於有些數據集天生分布不明顯的數據集,怎麽才能正確的選擇聚類中心的個數,例如:

技術分享圖片

使用(elbow method)“胳膊肘算法”:

獲取損失函數和聚類中心K的函數圖像,大致有兩種圖像類型

技術分享圖片

左圖的拐點明顯,而右圖的拐點不是很明顯,對於左圖我們可以選取拐點處的k作為聚類中心的個數,而如果是右圖,那麽就需要根據情況選取,比如說,如果數據集是衣服的尺碼的數據,如果你想確定這些衣服的尺碼類型,那麽根據你想要分成幾種尺碼類型決定(例如:L,M,S)(還有,M,L,XL,XXL,S)

我眼裏K-Means算法