Kmeans演算法及相關優化

2021-09-24 19:49:06 字數 4022 閱讀 2103

(1)kmeans演算法是一種無監督聚類演算法。

(2)演算法的目標:給定樣本集,根據樣本之間的距離大小,將樣本劃分為k個簇,讓簇內的點之間的距離盡可能近,讓簇間的點的距離盡可能的遠。

(3)演算法的思路:在給定k值和k個初始類簇中心點的情況下,把每個點(樣本資料)分到距離最近的類簇中心點代表的類簇中。分配完畢後,根據乙個類簇中的所有點重新計算類簇中心點,然後再迭代的進行分配點和更新類簇中心點的過程,直到沒有(或者是預期要求)點被分配到其它類簇中,沒有(或達到預期要求)類簇中心點再發生更新,誤差平方和最小(或達到某一條件)。

假設簇劃分為(c1c_

c1​…ckc_

ck​),誤差平方和e表示為

e =∑

i=1k

∑x∈c

i∣x−

ui∣2

e = \sum_^k\sum_}|x - u_|^2

e=i=1∑

k​x∈

ci​∑

​∣x−

ui​∣

2上面的公式不太準確,但對於理解問題足夠了。其中,x

xx為某個樣本資料,uiu_

ui​ 為cic_

ci​的質心,表示為

u i=

1∣ci

∣∑x∈

cixu_ = \frac|}\sum_}x

ui​=∣c

i​∣1

​x∈c

i​∑​

x我們的目的是使讓e盡可能小,但直接求解e很困難,通常採用上面說的啟發式迭代求解。

在描述具體演算法流程之前,我們先來思考一下初始類簇中心點的選取。(合理的確定k值和k個初始類簇中心點對演算法的聚類結果和執行時間(迭代次數)有很大的影響。

(1)最簡單的方法確定k個初始類簇中心點的方法是隨即選取k個點,但這種方法很明顯在某些情況下會很差。

(2)選擇彼此距離盡可能遠的k個點

首先。隨機選擇乙個點作為第乙個初始類簇點,然後選擇距離該點最遠的那個點作為第二個初始類簇點,然後再選擇距離前兩個類簇點距離最遠的點作為第三個類簇中心點,以此類推,直到選出k個點。

(3)選用層次聚類演算法或canopy演算法進行初始聚類,然後利用這些類簇的中心點作為kmeans演算法的初始中心類簇點。本人能力有限,這裡只簡單介紹一下canopy演算法:

首先,定義兩個距離t1、t2,t1 > t2。從樣本集s中隨機移除乙個點p,對與還在樣本集s中的每個點,計算其與p的距離,若距離小於t2,則將其從s中移除,並新增到p點代表的簇中,若距離小於t1,而大於t2,依然將其新增到p代表的類簇中,但不將其從s中移除。迭代完一次後,從剩餘的s中重新選擇乙個點作為新的p,重複上述過程。

canopy演算法的特別之處在與樣本中的某條資料可能重複出現在不同的類簇中。我們可以使用canopy計算出來的中心點作為kmeans演算法的初始類簇中心點。

給定乙個合適的類簇指標,比如類簇的平均半徑或直徑,只要我們假設的類簇數目等於或高與真實的類簇數目時,該指標變化的很慢,但若小於真實的類簇數目,該指標會快速變化。

類簇的直徑指簇內任意兩點之間的最大距離。

類簇的半徑指簇內的所有點到類簇中心點的最大距離。

放兩張圖便於理解

左圖是k取值從2到7時的聚類效果,右圖是k取值從2到9時的類簇指標的變化曲線,此處選擇類簇指標是k個類簇的平均質心距離的平均值。從上圖中可以明顯看到,當k取值為5的前後,類簇指標的變化情況,所以k的正確取值應該是5。

現在,總結一下kmeans演算法的具體流程

輸入:初始樣本集d,聚類數k,(最大迭代次數n)

輸出:簇的劃分c

(1)選則k個初始類簇中心點,每個簇初始為空(或為初始類簇中心點,這個要看中心點的選擇)。

(2)對於每個樣本,計算其於各個質心的距離,將其劃分到距離最小的類簇中。

(3)重新計算每個類簇的質心(中心點)。

(4)若未達到終止條件(所有質心未變,沒有點被重新分配,誤差平方達到要求)則轉到(2)

(5)輸出簇的劃分。

(1)kmeans演算法對噪音和異常點比較敏感,可以使用一些離群點檢測演算法(比如lof)進行預處理,去除異常點後進行聚類。

(2)在距離計算上進行優化。

(3)在樣本量比較大時,可以隨機選擇部分進行kmeans演算法,進行多次。

…(1)原理比較簡單。

(2)聚類效果比較好。

(1)在k值和初始類簇中心點選擇不當時收斂較慢。

(2)對離群點和孤立點敏感。

(3)對於非凸資料集比較難收斂。

(4)採用迭代的方法,只能保證區域性最優。

在網上看了很多講解lof的文章,這裡來總結一下自己的思路。

(在平面空間中)假設有一點p,和乙個初始設定的k值。以p為圓心,由內向外尋找與p最臨近的k個點,把找到的第k個點記為o。此時,以p為圓心,以p點到o點的距離為半徑(記為len1)的範圍內有至少k個點(因為可能有距離相等的點),我們稱這個範圍為p的k鄰域。然後我們以o點為圓心,以同樣的方式尋找o的k鄰域以及它的半徑(len2)。若len1遠大與len2,則說明p為離群點。

在安徽大學李芳的碩士**中提到了k-means演算法的k值自適應優化方法。

演算法思路為:在開始的時候給定乙個合適(也有說法為乙個較大的)的k值,通過一次kmeans演算法得到一次聚類中心。根據k個類簇中心點之間的距離,合併距離最近的類簇,並將k值減一。迴圈使用此方法,直到達到終止條件(整個資料集的誤差平方和達到某個值或不變,或則達到迭代次數),最終得到較優聚類數的聚類結果。

(1)knn,k-nearestneighbor,所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以由它最鄰近的k個值來表示。

(2)knn演算法是監督演算法,演算法中所選擇的鄰居都是已經正確分類的樣本。knn演算法的核心思想是當某一樣本周圍最近的k個鄰居中大多數屬於某一類別,那此樣本也屬於這個類別。

(3)knn主要靠周圍k個點來確定其類別,而不是通過判斷類域的方法,所以對於類域有交叉或重疊的樣本集比較合適。

如上圖,當k為3時,綠色節點會被判定為紅色三角,若k為5,綠色節點會被判定為藍色方塊。

knn演算法不僅可以用於分類,還可以用於回歸。通過找出乙個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。更有用的方法是將不同距離的鄰居對該樣本產生的影響給予不同的權值(weight),如權值與距離成反比。

該演算法在分類時有個主要的不足是,當樣本不平衡時,如乙個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入乙個新樣本時,該樣本的k個鄰居中大容量類的樣本占多數。另乙個不足之處是計算量較大,因為對每乙個待分類的文字都要計算它到全體已知樣本的距離,才能求得它的k個最近鄰點。

針對分類效率改進:事先對樣本屬性進行約簡,刪除對分類結果影響較小的屬性,快速的得出待分類樣本的類別。

針對分類效果改進:採用權值的方法(和該樣本距離小的鄰居權值大)來改進。

(1)在使用訓練集對引數進行訓練的時候,一般分為:訓練集(train_set),評估集(valid_set),測試集(test_set)這三個部分。其中測試集很好理解,其實就是完全不參與訓練的資料,僅僅用來觀測測試效果的資料。

(2)因為在實際的訓練中,訓練的結果對於訓練集的擬合程度通常還是挺好的(初始條件敏感),但是對於訓練集之外的資料的擬合程度通常就不那麼令人滿意了。因此我們通常並不會把所有的資料集都拿來訓練,而是分出一部分來(這一部分不參加訓練)對訓練集生成的引數進行測試評估,相對客觀的判斷這些引數對訓練集之外的資料的符合程度。這種思想就稱為交叉驗證。

(3)k折交叉驗證,初始取樣分割成k個子樣本,乙個單獨的子樣本被保留作為驗證模型的資料,其他k-1個樣本用來訓練。交叉驗證重複k次,每個子樣本驗證一次,平均k次的結果或者使用其它結合方式,最終得到乙個單一估測。這個方法的優勢在於,同時重複運用隨機產生的子樣本進行訓練和驗證,每次的結果驗證一次,10折交叉驗證是最常用的。

k means演算法優化

一 k means演算法介紹 k means 演算法是首先從含有n個資料物件的資料集中隨機選擇k個資料物件作為初始中心。然後計算每個資料物件到各中心的距離,根據最近鄰原則,所有資料物件將會被劃分到離它最近的那個中心所代表的簇中。接著分別計算新生成的各個簇中資料物件的均值作為各簇新的中心,比較新的中心...

K means演算法及其優化

聚類演算法是一種典型的無監督學習演算法,主要用於將相似的樣本自動歸到乙個類別中。聚類演算法與分類演算法最大的區別是 聚類演算法是無監督的學習演算法,而分類演算法屬於監督的學習演算法。在聚類演算法中根據樣本之間的相似性,將樣本劃分到不同的類別中,對於不同的相似度計算方法,會得到不同的聚類結果,常用的相...

k means演算法及改進

k means是最常用的聚類演算法 k means演算法流程 1 選擇k個類為初始中心 2 在第i次迭代中,對任意樣本,計算其到各中心的距離,將樣本歸到距離最短的中心所在的類 3 利用均值等方法更新類的中心值 4 對於聚類中心,經過2 3 迭代後,值保持不變,迭代結束,否則繼續迭代。k means偽...