1. 程式人生 > >K-means(K-均值)聚類演算法

K-means(K-均值)聚類演算法

劃分方法

聚類分析最簡單、最基本的版本是劃分,它把物件組織成多個互斥的簇。這一方法,要求每個物件必須/恰好屬於每一個簇。(事實上,我們應該知道,這個要求是很不合理的,因為它忽略了離群點,假若把噪聲資料強行劃分在簇裡,那勢必會降低聚類的準確率,所以為了改進這一點,在模糊劃分中適當放寬了這一要求。
大部分的劃分演算法都是基於距離的。(這個應該也很好理解吧,我們在前面應該提到過不止一次,這裡說的距離實際上是用來度量相似性的)。他們的操作步驟通常是這樣的:
1、首先給定要構建的分割槽數K,然後直接建立一個初始劃分;
2、然後,使用一種稱之為迭代的重定位技術來不斷的調整,改進劃分。(它的改進準則是:同一個簇中的物件要儘可能接近,不同簇中的物件要儘可能的遠離)

從上面我們可以看到,這種傳統的操作方法,為了達到全域性最優,演算法很有可能要窮舉所有可能的劃分,這顯示不是不可接受的。因此實際上,目前的劃分演算法一般都採用啟發式的方法,即漸進的提高聚類質量,以逼近區域性最優解。

下面,我們就來講解目前流行的劃分演算法:K-均值演算法和K-中心點演算法。這類演算法非常適合發現中小規模的資料庫中的球狀簇(實際上是近似於球)

K-均值演算法:一種基於形心的技術

假設資料集D中包含n個歐式空間中的物件,劃分方法就是把D中的物件分配到k個簇中,其中各個簇之間互斥。然後通過目標函式來評估劃分簇的質量,然後不斷調整。
其實我們可以看到,這裡敘述的劃分方法和上面的傳統方法基本一樣。但是還沒有完!!!
我們知道,劃分方法一般聚類的都是球狀簇。那麼既然是球,就自然有球心。因此,這裡說的基於形心的

/形心實質上就可以理解為球心。
我們一般用簇Ci形心來代表該簇。從概念上來講,簇的形心就是它的中心點。而這個中心點可以用多種方法定義(為什麼呢?因為,這個球狀只是我們看起來是球的形狀而已,他並不是幾何意義上的球,所以,要找出這個“球”的中心,自然不像幾何那麼嚴謹),例如可以取該簇中所有物件的均值或中心點
上面我們提到了目標函式,它的值被稱為簇內變差。它的作用就是用來評估簇劃分的質量的,即一個簇的劃分質量可以用簇內變差度量。我們的目的就是要讓簇內高相似性和簇間低相似性。


這裡寫圖片描述

這裡p是空間中的點,Ci表示簇的形心。實際上,簇內變差就是求簇內每個物件到簇中心點(K-均值演算法的話均值就是中心點)的距離平方,然後求和

總的來說,我們要提高聚類質量,那麼就要不斷的去優化簇內變差。但是傳統劃分演算法開銷巨大,所以這裡我們引出了k-均值演算法。
這個演算法就是把簇的形心定義為簇內點的均值。它的處理流程如下
1、在資料集中,隨機地選擇k個物件,每個物件代表一個簇的初始均值(中心);
2、對剩下的每個物件,分別計算其與各個簇中心的歐式距離(事實上就是計算相似性),將它分配到最相似的簇;
3、更新簇中心。對於每個簇來說,就是根據簇中的當前物件,來重新計算每個簇的均值,然後把該均值作為新的簇的中心。
4、然後重複第2,3步直至分配穩定。

K-均值演算法的特點是:不能保證該演算法收斂域全域性最優解,並且它常常終止於一個區域性最優解。結果可能依賴於初始簇中心的隨機選擇,所以為了儘可能的得到好的結果,我們通常會選擇不同的初始簇中心,來多疑執行K-均值演算法。

k-均值演算法的優缺點
優點:
1、對於處理大資料集,該演算法是相對可伸縮的和有效的;
缺點:
1、僅當簇的均值有定義時才能使用K-均值定義。例如,處理標稱資料就不能使用K-均值演算法。因為它無法計算簇內均值呀(對映???我想應該不可以吧=。=),所以針對這種情況,可以使用k-眾數演算法來處理標稱資料
2、對噪聲和離群點敏感。上面已經提到了,因為它的劃分是互斥的,所以必然會出現這種情況。所以針對這種情況,出現了模糊劃分技術。上面已經提到過。
3、必須使用者自己指定要生成的簇數K。然而要求使用者自己指定引數一般都是不靠譜的,所以這裡給出了一種解決方法,那就是提供一個k的取值範圍然後去試,然後取一個相對較好的。實際上,我們也能想象到這種方法其實也不好。

如何提高K-均值演算法的效能
因為這個演算法實在太簡單了,所以它的效能能夠提升的方面也就是伸縮性了。
在面對大資料集時,通過使用這三種方法來提高K-均值的伸縮性
1、使用樣本;
2、過濾方法(使用空間層次索引以降低計算均值時的開銷);
3、微聚類方案。

我們接下來稍稍引申一下

K-中心點:一種基於代表物件的技術
K-中心點演算法是針對K-均值演算法對離群點和噪聲敏感的缺點提出的一種改進演算法。
類比於K-均值演算法,K-中心點聚類演算法的變動主要有兩點
1、中心點不是均值,而是用一個實際的物件(稱作“代表物件”)來表示中心點;
2、目標函式不是距離的平方和了而是絕對距離和了。


這裡寫圖片描述
其中,Oi是代表物件。
關於這個公式需要好好理解下, 它的值表示的是資料集中所有物件P與Ci的代表物件Oi的絕對誤差之和。
同樣的,K-中心點方法通過最小化該絕對誤差,來實現對劃分的優化。

下面我們是否要更新代表物件,就靠這個目標函式的值來決定了。

PAM演算法是K-中心點聚類的一種流行的實現。它的主要流程如下
1、隨機選擇K個物件,每個物件代表一個簇的中心點;
2、對剩下的每個物件,分別計算其與各個簇中心(代表物件)的歐式距離,將它分配到最相似的簇;
3、更新代表物件了。這一步稍微有點複雜,我拆開來說。
3.1:為了決定一個非代表物件是否是當前的一個代表物件更好的替代,我們需要來計算一下。
3.2:首先計算所有點(除開該候選物件)到當前代表物件集合的絕對誤差之和(實際上就是計算公式10.2)
3.3:然後計算所有點(除開待替換物件)到當前代表物件集合(該集合目前是少了待替換物件,多了該候選物件)的絕對誤差之和(公式10.2)
3.4:接著,比較這兩次計算的值,如果3.3的值比3.2的值小,那麼說明如果我們使用該候選點替換該中心點之後,聚類的效果會更好。所以我們進行中心點的替換(代表物件)。
4、重複第2,3步直至聚類穩定。

從演算法我們可以看出,使用了新的目標函式之後,K-中心點演算法(具體來說是PAM演算法)相對與K-均值演算法來說,它對於離群點和噪聲資料不那麼敏感了。但同時,我們也能看到,該演算法的計算量是相當巨大的。
所以,一般來說,PAM演算法一般都應用與小型的資料集上。