聚類就是對大量未知标注(無監督)的資料集,按照資料之間的相似度,将N個對象的資料集劃分為K個劃分(K個簇),使類别内的資料相似度較大,而類别間的資料相似較小。比如使用者畫像就是一種很常見的聚類算法的應用場景,基于使用者行為特征或者中繼資料将使用者分成不同的類。
也被稱為k-均值,是一種最廣泛使用的聚類算法,也是其他聚類算法的基礎。來看下它的原理:
既然要劃分為k個簇,是以算法首先随機的選擇了k個對象,每個對象初始的代表了一個簇的中心。其他的對象就去計算它們與這k個中心的距離(這裡距離就是相似度),離哪個最近就把它們丢給哪個簇。第一輪聚類結束後,重新計算每個簇的平均值,将N中全部元素按照新的中心重新聚類。這個過程不斷的反複,使得每一個改進之後的劃分都比之前效果好,直到準則函數收斂(聚類結果不再變化)。

舉個例子,10個男生我要分為2個類,我先随機選擇2個男生a b,那麼對于c,我分别計算他與a b 的相似度,假設和a最相似,那麼我丢到a這個類裡,經過第一輪,得到(1類){a,c,e,f,i}(2類) {b,d,g,h,j},現在我重新計算1類和2類的均值,假設為1.5和5.1,那麼對這10個男生再判斷它們與1.5 5.1的距離,和哪個相近就去哪邊。第二輪疊代使得聚類更加精确。反複這樣,直到某一次的疊代我發現不再有變化,那麼就ok了。
但是K-means有些缺點,其一是受初始值影響較大。下面這張圖很好的解釋了這個缺點,人眼一看就能看出來,如果是分為4個聚類,應該這麼分為左邊那樣的,如果用K-means結果會是右邊這樣,明顯不對,是以說受初始值的影響會比較大。
因為這個缺陷,是以有了Bisecting k-means(二分K均值)
主要是為了改進k-means算法随機選擇初始中心的随機性造成聚類結果不确定性的問題,而Bisecting k-means算法受随機選擇初始中心的影響比較小。
先将所有點作為一個簇,然後将該簇一分為二。之後選擇其中一個簇【具有最大SSE值的一個簇】繼續進行劃分,二分這個簇以後得到的2個子簇,選擇2個子簇的總SSE最小的劃分方法,這樣能夠保證每次二分得到的2個簇是比較優的(也可能是最優的)。
SSE(Sum of Squared Error),也就是誤差平方和,它計算的是拟合資料和原始資料對應點的誤差的平方和,它是用來度量聚類效果的一個名額。SSE越接近于0,說明模型選擇和拟合更好,資料預測也越成功。
上面講的都是硬聚類,硬聚類即一定是屬于某一個類,比如我有2個簇A和B,那麼所有的對象要不屬于A要不就屬于B,不可能會有第三種可能。而軟聚類,使用機率的方式,一個對象可以是60%屬于A,40% 屬于B,即不完全屬于同一個分布,而是以不同的機率分屬于不同的分布。GMM(高斯混合模型)就是一種軟聚類。
它和K-Means的差別是,K-Means是算出每個資料點所屬的簇,而GMM是計算出這些資料點配置設定到各個類别的機率。
GMM算法步驟如下:
1.猜測有 K 個類别、即有K個高斯分布。
2.對每一個高斯分布賦均值 μ 和方差 Σ 。
3.對每一個樣本,計算其在各個高斯分布下的機率。
4.每一個樣本對某高斯分布的貢獻可以由其下的機率表示。并把該樣本對該高斯分布的貢獻作為權重來計算權重的均值和方差以替代其原本的均值和方差。
5.重複3~4直到每一個高斯分布的均值和方差收斂。
SparkML中主要聚類有以下幾種:
K-means
Latent Dirichlet allocation (LDA)
Bisecting k-means
Gaussian Mixture Model (GMM)
輸出結果為:
附:kmeans_data.txt
可以發現,使用kmeans和BisectingKMeans,聚類結果一般是不一樣的。
LDA是一個三層貝葉斯機率模型,包含詞、主題和文檔三層結構。
LDA可以用來生成一篇文檔,生成時,每個詞都是通過“以一定機率選擇了某個主題,并從這個主題中以一定機率選擇某個詞語”,這樣反複進行,就可以生成一篇文檔;反過來,LDA又是一種非監督機器學習技術,可以識别出大規模文檔集或語料庫中的主題。
輸出結果:
附:lda_data.txt