本學習筆記參考自吳恩達老師機器學習公開課
聚類算法是一種無監督學習算法。k均值算法是其中應用最為廣泛的一種,算法接受一個未標記的數據集,然后將數據聚類成不同的組。K均值是一個迭代算法,假設我們想要將數據聚類成K個組,其方法為:
- 隨機選擇K個隨機的點(稱為聚類中心);
- 對與數據集中的每個數據點,按照距離K個中心點的距離,將其與距離最近的中心點關聯起來,與同一中心點關聯的所有點聚成一類;
- 計算每一組的均值,將該組所關聯的中心點移動到平均值的位置;
- 重復執行2-3步,直至中心點不再變化
算法的數學表示
算法的輸入(input):
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的取值;即便若此,該方法還是值得推薦和嘗試的。