不多說,直接上干貨!
面試很容易被問的:K-Means算法的收斂性。
在網上查閱了很多資料,並沒有看到很清晰的解釋,所以希望可以從K-Means與EM算法的關系,以及EM算法本身的收斂性證明中找到蛛絲馬跡,下次不要再掉坑啊。
EM算法的收斂性
1.通過極大似然估計建立目標函數:
通過EM算法來找到似然函數的極大值,思路如下:
希望找到最好的參數θ,能夠使最大似然目標函數取最大值。但是直接計算 比較困難,所以我們希望能夠找到一個不帶隱變量z的函數
恆成立,並用
逼近目標函數。
如下圖所示:
- 在綠色線位置,找到一個γγ函數,能夠使得該函數最接近目標函數
- 固定γγ函數,找到最大值,然后更新θθ,得到紅線;
- 對於紅線位置的參數θ:
- 固定θθ,找到一個最好的函數γγ,使得該函數更接近目標函數。
重復該過程,直到收斂到局部最大值。
- 固定θθ,找到一個最好的函數γγ,使得該函數更接近目標函數。
2. 從Jensen不等式的角度來推導
令是zz的一個分布,
,則:
(對於log函數的Jensen不等式)
3.使等號成立的Q
盡量使≥≥取等號,相當於找到一個最逼近的下界:也就是Jensen不等式中,,當且僅當x1=x2x1=x2時等號成立(很關鍵)。
對於EM的目標來說:應該使得loglog函數的自變量恆為常數,即:
也就是分子的聯合概率與分母的z的分布應該成正比,而由於Q是z的一個分布,所以應該保證
4.EM算法的框架
由上面的推導,可以得出EM的框架:
回到最初的思路,尋找一個最好的γγ函數來逼近目標函數,然后找γγ函數的最大值來更新參數θθ:
- E-step: 根據當前的參數θθ找到一個最優的函數γγ能夠在當前位置最好的逼近目標函數;
- M-step: 對於當前找到的γγ函數,求函數取最大值時的參數θθ的值。
K-Means的收斂性
通過上面的分析,我們可以知道,在EM框架下,求得的參數θθ一定是收斂的,能夠找到似然函數的最大值。那么K-Means是如何來保證收斂的呢?
目標函數
假設使用平方誤差作為目標函數:
E-Step
固定參數μkμk, 將每個數據點分配到距離它本身最近的一個簇類中:

M-Step
固定數據點的分配,更新參數(中心點)μkμk:
所以,答案有了吧。為啥K-means會收斂呢?目標是使損失函數最小,在E-step時,找到一個最逼近目標的函數γγ;在M-step時,固定函數γγ,更新均值μμ(找到當前函數下的最好的值)。所以一定會收斂了.
如何快速收斂超大的KMeans?
最近,被一個牛人問道了這個問題:超億個節點,進行KMeans的聚類,每次迭代都要進行K×億的運算,如何能讓這個迭代快速的收斂?
當場暈倒,從來沒有考慮過這些問題,基礎的數據挖據算法不考慮超大級別的運算問題。
回來想了想,再看看Mahout的KMeans的實現方法,覺得可以這么解決.
1. 第一次迭代的時候,正常進行,選取K個初始點,然后計算所有節點到這些K的距離,再分到不同的組,計算新的質心;
2. 后續迭代的時候,在第m次開始,每次不再計算每個點到所有K個質心的距離,僅僅計算上一次迭代中離這個節點最近的某幾個(2到3)個質心的距離,決定分組的歸屬。對於其他的質心,因為距離實在太遠,所以歸屬到那些組的可能性會非常非常小,所以不用再重復計算距離了。
3. 最后,還是用正常的迭代終止方法,結束迭代。
這個方法中,有幾個地方需要仔細定義的。
第一,如何選擇m次? 過早的話,后面的那個歸屬到遠距離組的可能性會增加;過晚,則收斂的速度不夠。
第二,如何選擇最后要比較的那幾個質心點數?數量過多則收斂的速度提高不明顯,過少則還是有可能出現分組錯誤。
這兩個問題應該都沒有標准答案,就如同K值的選取。我自己思考的基本思路可以是:
1. 從第三次開始就開始比較每次每個質心的偏移量,亦即對於收斂的結束的標准可以划分兩個閾值,接近優化的閾值(比如偏移范圍在20%)和結束收斂的閾值(比如偏移范圍在10%以內)。m次的選擇可以從達到接近優化的閾值開始。
2. 選擇比較的質心點數可以設定一個閾值,比較一個點到K個質心的距離,排序這些距離,或者固定選取一個數值,比如3個最近的點,或者按最近的20%那些質心點。
這些就是基本的思路。歡迎大家討論。