導航:首頁 > 源碼編譯 > kmeans演算法的簡單示例

kmeans演算法的簡單示例

發布時間:2023-03-16 20:17:09

『壹』 八:聚類演算法K-means(20191223-29)

學習內容:無監督聚類演算法K-Means

k-means:模型原理、收斂過程、超參數的選擇

聚類分析是在數據中發現數據對象之間的關系,將數據進行分組,組內的相似性越大,組間的差別越大,則聚類效果越好。

不同的簇類型: 聚類旨在發現有用的對象簇,在現實中我們用到很多的簇的類型,使用不同的簇類型劃分數據的結果是不同的。

基於原型的: 簇是對象的集合,其中每個對象到定義該簇的 原型 的距離比其他簇的原型距離更近,如(b)所示的原型即為中心點,在一個簇中的數據到其中心點比到另一個簇的中心點更近。這是一種常見的 基於中心的簇 ,最常用的K-Means就是這樣的一種簇類型。 這樣的簇趨向於球形。

基於密度的 :簇是對象的密度區域,(d)所示的是基於密度的簇,當簇不規則或相互盤繞,並且有早上和離群點事,常常使用基於密度的簇定義。

關於更多的簇介紹參考《數據挖掘導論》。

基本的聚類分析演算法

     1. K均值: 基於原型的、劃分的距離技術,它試圖發現用戶指定個數(K)的簇。

     2. 凝聚的層次距離: 思想是開始時,每個點都作為一個單點簇,然後,重復的合並兩個最靠近的簇,直到嘗試單個、包含所有點的簇。

     3. DBSCAN: 一種基於密度的劃分距離的演算法,簇的個數有演算法自動的確定,低密度中的點被視為雜訊而忽略,因此其不產生完全聚類。

不同的距離量度會對距離的結果產生影響,常見的距離量度如下所示:

優點:易於實現 

缺點:可能收斂於局部最小值,在大規模數據收斂慢

演算法思想:

選擇K個點作為初始質心 

repeat

    將每個點指派到最近的質心,形成K個簇 

    重新計算每個簇的質心  

until 簇不發生變化或達到最大迭代次數

這里的「重新計算每個簇的質心」,是根據目標函數來計算的,因此在開始時要考慮 距離度量和目標函數。

考慮歐幾里得距離的數據,使用 誤差平方和(Sum of the Squared Error,SSE) 作為聚類的目標函數,兩次運行K均值產生的兩個不同的簇集,使用SSE最小的那個。

k表示k個聚類中心,ci表示第幾個中心,dist表示的是歐幾里得距離。 

這里有一個問題就是為什麼,我們更新質心是讓所有的點的平均值,這里就是SSE所決定的。

k均值演算法非常簡單且使用廣泛,但是其有主要的兩個缺陷:

1. K值需要預先給定 ,屬於預先知識,很多情況下K值的估計是非常困難的,對於像計算全部微信用戶的交往圈這樣的場景就完全的沒辦法用K-Means進行。對於可以確定K值不會太大但不明確精確的K值的場景,可以進行迭代運算,然後找出Cost Function最小時所對應的K值,這個值往往能較好的描述有多少個簇類。

2. K-Means演算法對初始選取的聚類中心點是敏感的 ,不同的隨機種子點得到的聚類結果完全不同

3. K均值演算法並不是很所有的數據類型。 它不能處理非球形簇、不同尺寸和不同密度的簇,銀冠指定足夠大的簇的個數是他通常可以發現純子簇。

4. 對離群點的數據進行聚類時,K均值也有問題 ,這種情況下,離群點檢測和刪除有很大的幫助。

下面對初始質心的選擇進行討論:

當初始質心是隨機的進行初始化的時候,K均值的每次運行將會產生不同的SSE,而且隨機的選擇初始質心結果可能很糟糕,可能只能得到局部的最優解,而無法得到全局的最優解。

多次運行,每次使用一組不同的隨機初始質心,然後選擇一個具有最小的SSE的簇集。該策略非常的簡單,但是效果可能不是很好,這取決於數據集合尋找的簇的個數。

關於更多,參考《數據挖掘導論》

為了克服K-Means演算法收斂於局部最小值的問題,提出了一種 二分K-均值(bisecting K-means)

將所有的點看成是一個簇

當簇小於數目k時

    對於每一個簇

        計算總誤差

        在給定的簇上進行K-均值聚類,k值為2        計算將該簇劃分成兩個簇後總誤差

    選擇是的誤差最小的那個簇進行劃分

在原始的K-means演算法中,每一次的劃分所有的樣本都要參與運算,如果數據量非常大的話,這個時間是非常高的,因此有了一種分批處理的改進演算法。

使用Mini Batch(分批處理)的方法對數據點之間的距離進行計算。

Mini Batch的好處:不必使用所有的數據樣本,而是從不同類別的樣本中抽取一部分樣本來代表各自類型進行計算。n 由於計算樣本量少,所以會相應的減少運行時間n 但另一方面抽樣也必然會帶來准確度的下降。

聚類試圖將數據集中的樣本劃分為若干個通常是不相交的子集,每個子集成為一個「簇」。通過這樣的劃分,每個簇可能對應於一些潛在的概念(也就是類別);需說明的是,這些概念對聚類演算法而言事先是未知的,聚類過程僅能自動形成簇結構,簇對應的概念語義由使用者來把握和命名。

聚類是無監督的學習演算法,分類是有監督的學習演算法。所謂有監督就是有已知標簽的訓練集(也就是說提前知道訓練集里的數據屬於哪個類別),機器學習演算法在訓練集上學習到相應的參數,構建模型,然後應用到測試集上。而聚類演算法是沒有標簽的,聚類的時候,需要實現的目標只是把相似的東西聚到一起。

聚類的目的是把相似的樣本聚到一起,而將不相似的樣本分開,類似於「物以類聚」,很直觀的想法是同一個簇中的相似度要盡可能高,而簇與簇之間的相似度要盡可能的低。

性能度量大概可分為兩類: 一是外部指標, 二是內部指標 。

外部指標:將聚類結果和某個「參考模型」進行比較。

內部指標:不利用任何參考模型,直接考察聚類結果。

對於給定的樣本集,按照樣本之間的距離大小,將樣本集劃分為K個簇。讓簇內的點盡量緊密的連在一起,而讓簇間的距離盡量的大

初學者會很容易就把K-Means和KNN搞混,其實兩者的差別還是很大的。

K-Means是無監督學習的聚類演算法,沒有樣本輸出;而KNN是監督學習的分類演算法,有對應的類別輸出。KNN基本不需要訓練,對測試集裡面的點,只需要找到在訓練集中最近的k個點,用這最近的k個點的類別來決定測試點的類別。而K-Means則有明顯的訓練過程,找到k個類別的最佳質心,從而決定樣本的簇類別。

當然,兩者也有一些相似點,兩個演算法都包含一個過程,即找出和某一個點最近的點。兩者都利用了最近鄰(nearest neighbors)的思想。

優點:

簡單, 易於理解和實現 ;收斂快,一般僅需5-10次迭代即可,高效

缺點:

    1,對K值得選取把握不同對結果有很大的不同

    2,對於初始點的選取敏感,不同的隨機初始點得到的聚類結果可能完全不同

    3,對於不是凸的數據集比較難收斂

    4,對噪點過於敏感,因為演算法是根據基於均值的

    5,結果不一定是全局最優,只能保證局部最優

    6,對球形簇的分組效果較好,對非球型簇、不同尺寸、不同密度的簇分組效果不好。

K-means演算法簡單理解,易於實現(局部最優),卻會有對初始點、雜訊點敏感等問題;還容易和監督學習的分類演算法KNN混淆。

參考閱讀:

1.《 深入理解K-Means聚類演算法 》

2.《 K-Means 》

『貳』 聚類演算法--KMeans

    與分類、序列標注等任務不同,聚類是在事先並不知道任何樣本標簽的情況下,通過數據之間的內在關系把樣本劃分為若干類別,使得同類別樣本之間的相似度高,不同類別之間的樣本相似度低(即增大類內聚,減少類間距)。    

    聚類屬於非監督學習,K均值聚類是最基礎常用的聚類演算法。它的基本思想是,通過迭代尋找K個簇(Cluster)的一種劃分方案,使得聚類結果對應的損失函數最小。其中,損失函數可以定義為各個樣本距離所屬簇中心點的誤差平方和。

其中 代表第i個樣本, 是 所屬的簇,  代表簇對應的中心點,M是樣本總數。

相關概念:

    K值: 要得到的簇的個數。

    質心: 每個簇的均值向量。即向量各維取平均即可。

    距離量度: 常用歐幾里得距離和餘弦相似度(先標准化)。

    KMeans的主要思想是:在給定K值和K個初始類簇中心點的情況下,把每個點(亦即數據記錄)分到離其最近的類簇中心點所代表的類簇中,所有點分配完畢之後,根據一個類簇內的所有點重新計算該類簇的中心點(取平均值),然後再迭代的進行分配點和更新類簇中心點的步驟,直至類簇中心點的變化很小,或者達到指定的迭代次數。

    KMeans的核心目標是將給定的數據集劃分成K個簇(K是超餐),並給出每個樣本數據對應的中心點。具體步驟非常簡單:

    (1)首先確定一個K值,即我們希望將數據集經過聚類得到k個集合。

    (2)從數據集中隨機選擇K個數據點作為質心。

    (3)對數據集中每一個點,計算其與每一個質心的距離(如歐式距離),離哪個質心近,就劃分到哪個質心所屬的集合。

    (4)把所有數據歸好集合後,一共有K個集合。然後重新計算每個集合的質心。

    (5)如果新計算出來的質心和原來的質心之間的距離小於某一個設置的閾值(表示重新計算的質心的位置變化不大,趨於穩定,或者說收斂),我們可以認為聚類已經達到期望的結果,演算法終止。

    (6)如果新質心和原質心距離變化很大,需要迭代3-5步驟。

KMeans最核心的部分是先固定中心點,調整每個樣本所屬的類別來減少J;再固定每個樣本的類別,調整中心點繼續減小J。兩個過程交替循環,J單調遞減直到極小值,中心點和樣本劃分的類別同時收斂。

KMeans的優點 :

 高效可伸縮,計算復雜度為O(NKt)接近於線性(N是數據量,K是聚類總數,t是迭代輪數)。

 收斂速度快,原理相對通俗易懂,可解釋性強。

當結果簇是密集的,而簇與簇之間區別是明顯時,他的效果較好。主要需要調參的參數僅僅是簇數K。

缺點 :

 受初始值和異常點影響,聚類結果可能不是全局最優而是局部最優。K-Means演算法對初始選取的質心點是敏感的,不同的隨機種子點得到的聚類結果完全不同,對結果影響很大。

 K是超參數,一般需要按經驗選擇。

 對噪音和異常點比較的敏感,用來檢測異常值。

 只能發現球狀的簇。在K-Means中,我們用單個點對cluster進行建模,這實際上假設各個cluster的數據是呈高維球型分布的,但是在生活中出現這種情況的概率並不算高。例如,每一個cluster是一個一個的長條狀的,K-Means的則根本識別不出來這種類別( 這種情況可以用GMM )。實際上,K-Means是在做凸優化,因此處理不了非凸的分布。

根據以上特點,我們可以從下面幾個角度對演算法做調優。

(1)數據預處理:歸一化和異常點過濾

    KMeans本質是一種基於歐式距離度量的數據劃分方法,均值和方差大的維度將對數據的聚類結果產生決定性影響 。所以在聚類前對數據( 具體的說是每一個維度的特徵 )做歸一化和單位統一至關重要。此外,異常值會對均值計算產生較大影響,導致 中心偏移 ,這些雜訊點最好能提前過濾。

(2)合理選擇K值

    K值的選擇一般基於實驗和多次實驗結果。例如採用 手肘法 ,嘗試不同K值並將對應的損失函數畫成折線。手肘法認為圖上的 拐點就是K的最佳值 (k=3)。

為了將尋找最佳K值的過程自動化,研究人員提出了Gap Statistic方法。不需要人們用肉眼判斷,只需要找到最大的Gap Statistic對應的K即可。

       損失函數記為  ,當分為K類時,Gap Statistic定義為:  。 是 的期望 ,一般由蒙特卡洛模擬產生。我們在樣本所在的區域內按照均勻分布隨機地產生和原始樣本數一樣多的隨機樣本,並對這個隨機樣本做KMeans,得到一個 ,重復多次就可以計算出 的近似值。

       的物理含義是隨機樣本的損失與實際樣本的損失之差。Gap越大說明聚類的效果越好 。一種極端情況是,隨著K的變化 幾乎維持一條直線保持不變。說明這些樣本間沒有明顯的類別關系,數據分布幾乎和均勻分布一致,近似隨機。此時做聚類沒有意義。

(3)改進初始值的選擇

    之前我們採用隨機選擇K個中心的做法,可能導致不同的中心點距離很近,就需要更多的迭代次數才能收斂。如果在選擇初始中心點時能 讓不同的中心盡可能遠離 ,效果往往更好。這類演算法中,以K-Means++演算法最具影響力。

(4)採用核函數

    主要思想是通過一個非線性映射,將輸入空間中的數據點映射到高維的特徵空間中,並在新的空間進行聚類。非線性映射增加了數據點線性可分的概率(與SVM中使用核函數思想類似)對於非凸的數據分布可以達到更為准確的聚類結果。

 (1)初始的K個質心怎麼選?

    最常用的方法是隨機選,初始質心的選取對最終聚類結果有影響,因此演算法一定要多執行幾次,哪個結果更合理,就用哪個結果。當然也有一些優化的方法,第一種是選擇彼此距離最遠的點,具體來說就是先選第一個點,然後選離第一個點最遠的當第二個點,然後選第三個點,第三個點到第一、第二兩點的距離之和最小,以此類推。第二種是先根據其他聚類演算法(如層次聚類)得到聚類結果,從結果中每個分類選一個點

(2)關於離群值?

    離群值就是遠離整體的,非常異常、非常特殊的數據點,在聚類之前應該將這些"極大""極小"之類的離群數據都去掉,否則會對於聚類的結果有影響。但是,離散值往往自身就很有分析的價值,可以把離群值單獨作為一類來分析。

(3)單位要一致!

(4)標准化

    數據中X整體都比較小,比如都是1到10之間的數,Y很大,比如都是1000以上的數,那麼在計算距離的時候Y起到的作用就比X大很多,X對於距離的影響幾乎可以忽略,這也有問題。因此,如果K-Means聚類中選擇歐幾里得距離計算距離,數據集又出現了上面所述的情況,就一定要進行數據的標准化(normalization),即將數據按比例縮放,使之落入一個小的特定區間。

    K-Means是無監督學習的聚類演算法,沒有樣本輸出;而KNN是監督學習的分類演算法,有對應的類別輸出 。KNN基本不需要訓練,對測試集裡面的點,只需要找到在訓練集中最近的K個點,用這最近的K個點的類別來決定測試點的類別。而K-Means則有明顯的訓練過程,找到K個類別的最佳質心,從而決定樣本的簇類別。當然,兩者也有一些相似點,兩個演算法都包含一個過程,即找出和某一個點最近的點。 兩周都利用了最近鄰的思想 。

『叄』 Kmeans聚類演算法簡介

由於具有出色的速度和良好的可擴展性,Kmeans聚類演算法算得上是最著名的聚類方法。Kmeans演算法是一個重復移動類中心點的過程,把類的中心點,也稱重心(centroids),移動到其包含成員的平均位置,然後重新劃分其內部成員。k是演算法計算出的超參數,表示類的數量;Kmeans可以自動分配樣本到不同的類,但是不能決定究竟要分幾個類。k必須是一個比訓練集樣本數小的正整數。有時,類的數量是由問題內容指定的。例如,一個鞋廠有三種新款式,它想知道每種新款式都有哪些潛在客戶,於是它調研客戶,然後從數據里找出三類。也有一些問題沒有指定聚類的數量,最優的聚類數量是不確定的。後面我將會詳細介紹一些方法來估計最優聚類數量。

Kmeans的參數是類的重心位置和其內部觀測值的位置。與廣義線性模型和決策樹類似,Kmeans參數的最優解也是以成本函數最小化為目標。Kmeans成本函數公式如下:

μiμi是第kk個類的重心位置。成本函數是各個類畸變程度(distortions)之和。每個類的畸變程度等於該類重心與其內部成員位置距離的平方和。若類內部的成員彼此間越緊湊則類的畸變程度越小,反之,若類內部的成員彼此間越分散則類的畸變程度越大。求解成本函數最小化的參數就是一個重復配置每個類包含的觀測值,並不斷移動類重心的過程。首先,類的重心是隨機確定的位置。實際上,重心位置等於隨機選擇的觀測值的位置。每次迭代的時候,Kmeans會把觀測值分配到離它們最近的類,然後把重心移動到該類全部成員位置的平均值那裡。

2.1 根據問題內容確定

這種方法就不多講了,文章開篇就舉了一個例子。

2.2 肘部法則

如果問題中沒有指定kk的值,可以通過肘部法則這一技術來估計聚類數量。肘部法則會把不同kk值的成本函數值畫出來。隨著kk值的增大,平均畸變程度會減小;每個類包含的樣本數會減少,於是樣本離其重心會更近。但是,隨著kk值繼續增大,平均畸變程度的改善效果會不斷減低。kk值增大過程中,畸變程度的改善效果下降幅度最大的位置對應的kk值就是肘部。為了讓讀者看的更加明白,下面讓我們通過一張圖用肘部法則來確定最佳的kk值。下圖數據明顯可分成兩類:

從圖中可以看出,k值從1到2時,平均畸變程度變化最大。超過2以後,平均畸變程度變化顯著降低。因此最佳的k是2。

2.3 與層次聚類結合

經常會產生較好的聚類結果的一個有趣策略是,首先採用層次凝聚演算法決定結果粗的數目,並找到一個初始聚類,然後用迭代重定位來改進該聚類。

2.4 穩定性方法

穩定性方法對一個數據集進行2次重采樣產生2個數據子集,再用相同的聚類演算法對2個數據子集進行聚類,產生2個具有kk個聚類的聚類結果,計算2個聚類結果的相似度的分布情況。2個聚類結果具有高的相似度說明kk個聚類反映了穩定的聚類結構,其相似度可以用來估計聚類個數。採用次方法試探多個kk,找到合適的k值。

2.5 系統演化方法

系統演化方法將一個數據集視為偽熱力學系統,當數據集被劃分為kk個聚類時稱系統處於狀態kk。系統由初始狀態k=1k=1出發,經過分裂過程和合並過程,系統將演化到它的穩定平衡狀態 kiki ,其所對應的聚類結構決定了最優類數 kiki 。系統演化方法能提供關於所有聚類之間的相對邊界距離或可分程度,它適用於明顯分離的聚類結構和輕微重疊的聚類結構。

2.6 使用canopy演算法進行初始劃分

基於Canopy Method的聚類演算法將聚類過程分為兩個階段

(1) 聚類最耗費計算的地方是計算對象相似性的時候,Canopy Method在第一階段選擇簡單、計算代價較低的方法計算對象相似性,將相似的對象放在一個子集中,這個子集被叫做Canopy,通過一系列計算得到若干Canopy,Canopy之間可以是重疊的,但不會存在某個對象不屬於任何Canopy的情況,可以把這一階段看做數據預處理;

(2) 在各個Canopy內使用傳統的聚類方法(如Kmeans),不屬於同一Canopy的對象之間不進行相似性計算。

從這個方法起碼可以看出兩點好處:首先,Canopy不要太大且Canopy之間重疊的不要太多的話會大大減少後續需要計算相似性的對象的個數;其次,類似於Kmeans這樣的聚類方法是需要人為指出K的值的,通過(1)得到的Canopy個數完全可以作為這個k值,一定程度上減少了選擇k的盲目性。

其他方法如貝葉斯信息准則方法(BIC)可參看文獻[4]。

選擇適當的初始質心是基本kmeans演算法的關鍵步驟。常見的方法是隨機的選取初始中心,但是這樣簇的質量常常很差。處理選取初始質心問題的一種常用技術是:多次運行,每次使用一組不同的隨機初始質心,然後選取具有最小SSE(誤差的平方和)的簇集。這種策略簡單,但是效果可能不好,這取決於數據集和尋找的簇的個數。

第二種有效的方法是,取一個樣本,並使用層次聚類技術對它聚類。從層次聚類中提取kk個簇,並用這些簇的質心作為初始質心。該方法通常很有效,但僅對下列情況有效:(1)樣本相對較小,例如數百到數千(層次聚類開銷較大);(2) kk相對於樣本大小較小。

第三種選擇初始質心的方法,隨機地選擇第一個點,或取所有點的質心作為第一個點。然後,對於每個後繼初始質心,選擇離已經選取過的初始質心最遠的點。使用這種方法,確保了選擇的初始質心不僅是隨機的,而且是散開的。但是,這種方法可能選中離群點。此外,求離當前初始質心集最遠的點開銷也非常大。為了克服這個問題,通常該方法用於點樣本。由於離群點很少(多了就不是離群點了),它們多半不會在隨機樣本中出現。計算量也大幅減少。

第四種方法就是上面提到的canopy演算法。

常用的距離度量方法包括:歐幾里得距離和餘弦相似度。兩者都是評定個體間差異的大小的。

歐氏距離是最常見的距離度量,而餘弦相似度則是最常見的相似度度量,很多的距離度量和相似度度量都是基於這兩者的變形和衍生,所以下面重點比較下兩者在衡量個體差異時實現方式和應用環境上的區別。

藉助三維坐標系來看下歐氏距離和餘弦相似度的區別:

從圖上可以看出距離度量衡量的是空間各點間的絕對距離,跟各個點所在的位置坐標(即個體特徵維度的數值)直接相關;而餘弦相似度衡量的是空間向量的夾角,更加的是體現在方向上的差異,而不是位置。如果保持A點的位置不變,B點朝原方向遠離坐標軸原點,那麼這個時候餘弦相似cosθ是保持不變的,因為夾角不變,而A、B兩點的距離顯然在發生改變,這就是歐氏距離和餘弦相似度的不同之處。

根據歐氏距離和餘弦相似度各自的計算方式和衡量特徵,分別適用於不同的數據分析模型:歐氏距離能夠體現個體數值特徵的絕對差異,所以更多的用於需要從維度的數值大小中體現差異的分析,如使用用戶行為指標分析用戶價值的相似度或差異;而餘弦相似度更多的是從方向上區分差異,而對絕對的數值不敏感,更多的用於使用用戶對內容評分來區分用戶興趣的相似度和差異,同時修正了用戶間可能存在的度量標准不統一的問題(因為餘弦相似度對絕對數值不敏感)。

因為歐幾里得距離度量會受指標不同單位刻度的影響,所以一般需要先進行標准化,同時距離越大,個體間差異越大;空間向量餘弦夾角的相似度度量不會受指標刻度的影響,餘弦值落於區間[-1,1],值越大,差異越小。但是針對具體應用,什麼情況下使用歐氏距離,什麼情況下使用餘弦相似度?

從幾何意義上來說,n維向量空間的一條線段作為底邊和原點組成的三角形,其頂角大小是不確定的。也就是說對於兩條空間向量,即使兩點距離一定,他們的夾角餘弦值也可以隨意變化。感性的認識,當兩用戶評分趨勢一致時,但是評分值差距很大,餘弦相似度傾向給出更優解。舉個極端的例子,兩用戶只對兩件商品評分,向量分別為(3,3)和(5,5),這兩位用戶的認知其實是一樣的,但是歐式距離給出的解顯然沒有餘弦值合理。

我們把機器學習定義為對系統的設計和學習,通過對經驗數據的學習,將任務效果的不斷改善作為一個度量標准。Kmeans是一種非監督學習,沒有標簽和其他信息來比較聚類結果。但是,我們還是有一些指標可以評估演算法的性能。我們已經介紹過類的畸變程度的度量方法。本節為將介紹另一種聚類演算法效果評估方法稱為輪廓系數(Silhouette Coefficient)。輪廓系數是類的密集與分散程度的評價指標。它會隨著類的規模增大而增大。彼此相距很遠,本身很密集的類,其輪廓系數較大,彼此集中,本身很大的類,其輪廓系數較小。輪廓系數是通過所有樣本計算出來的,計算每個樣本分數的均值,計算公式如下:

aa是每一個類中樣本彼此距離的均值,bb是一個類中樣本與其最近的那個類的所有樣本的距離的均值。

輸入:聚類個數k,數據集XmxnXmxn。

輸出:滿足方差最小標準的k個聚類。

(1) 選擇k個初始中心點,例如c[0]=X[0] , … , c[k-1]=X[k-1];

(2) 對於X[0]….X[n],分別與c[0]…c[k-1]比較,假定與c[i]差值最少,就標記為i;

(3) 對於所有標記為i點,重新計算c[i]={ 所有標記為i的樣本的每個特徵的均值};

(4) 重復(2)(3),直到所有c[i]值的變化小於給定閾值或者達到最大迭代次數。

Kmeans的時間復雜度:O(tkmn),空間復雜度:O((m+k)n)。其中,t為迭代次數,k為簇的數目,m為樣本數,n為特徵數。

7.1 優點

(1). 演算法原理簡單。需要調節的超參數就是一個k。

(2). 由具有出色的速度和良好的可擴展性。

7.2 缺點

(1). 在 Kmeans 演算法中 kk 需要事先確定,這個 kk 值的選定有時候是比較難確定。

(2). 在 Kmeans 演算法中,首先需要初始k個聚類中心,然後以此來確定一個初始劃分,然後對初始劃分進行優化。這個初始聚類中心的選擇對聚類結果有較大的影響,一旦初始值選擇的不好,可能無法得到有效的聚類結果。多設置一些不同的初值,對比最後的運算結果,一直到結果趨於穩定結束。

(3). 該演算法需要不斷地進行樣本分類調整,不斷地計算調整後的新的聚類中心,因此當數據量非常大時,演算法的時間開銷是非常大的。

(4). 對離群點很敏感。

(5). 從數據表示角度來說,在 Kmeans 中,我們用單個點來對 cluster 進行建模,這實際上是一種最簡化的數據建模形式。這種用點來對 cluster 進行建模實際上就已經假設了各 cluster的數據是呈圓形(或者高維球形)或者方形等分布的。不能發現非凸形狀的簇。但在實際生活中,很少能有這種情況。所以在 GMM 中,使用了一種更加一般的數據表示,也就是高斯分布。

(6). 從數據先驗的角度來說,在 Kmeans 中,我們假設各個 cluster 的先驗概率是一樣的,但是各個 cluster 的數據量可能是不均勻的。舉個例子,cluster A 中包含了10000個樣本,cluster B 中只包含了100個。那麼對於一個新的樣本,在不考慮其與A cluster、 B cluster 相似度的情況,其屬於 cluster A 的概率肯定是要大於 cluster B的。

(7). 在 Kmeans 中,通常採用歐氏距離來衡量樣本與各個 cluster 的相似度。這種距離實際上假設了數據的各個維度對於相似度的衡量作用是一樣的。但在 GMM 中,相似度的衡量使用的是後驗概率 αcG(x|μc,∑c)αcG(x|μc,∑c) ,通過引入協方差矩陣,我們就可以對各維度數據的不同重要性進行建模。

(8). 在 Kmeans 中,各個樣本點只屬於與其相似度最高的那個 cluster ,這實際上是一種 hard clustering 。

針對Kmeans演算法的缺點,很多前輩提出了一些改進的演算法。例如 K-modes 演算法,實現對離散數據的快速聚類,保留了Kmeans演算法的效率同時將Kmeans的應用范圍擴大到離散數據。還有K-Prototype演算法,可以對離散與數值屬性兩種混合的數據進行聚類,在K-prototype中定義了一個對數值與離散屬性都計算的相異性度量標准。當然還有其它的一些演算法,這里我 就不一一列舉了。

Kmeans 與 GMM 更像是一種 top-down 的思想,它們首先要解決的問題是,確定 cluster 數量,也就是 k 的取值。在確定了 k 後,再來進行數據的聚類。而 hierarchical clustering 則是一種 bottom-up 的形式,先有數據,然後通過不斷選取最相似的數據進行聚類。

『肆』 kmeans聚類演算法是什麼

kmeans聚類演算法是將樣本聚類成k個簇(cluster)。

K-Means演算法的思想很簡單,對於給定的樣本集,按照樣本之間的距離大小,將樣本集劃分為K個簇。讓簇內的點盡量緊密的連在一起,而讓簇間的距離盡量的大。在實際K-Mean演算法中,我們一般會多次運行圖c和圖d,才能達到最終的比較優的類別。

用數據表達式表示

假設簇劃分為$(C_1,C_2,...C_k)$,則我們的目標是最小化平方誤差E:$$ E = sumlimits_{i=1}^ksumlimits_{x in C_i} ||x-mu_i||_2^2$$。

其中$mu_i$是簇$C_i$的均值向量,有時也稱為質心,表達式為:$$mu_i = frac{1}{|C_i|}sumlimits_{x in C_i}x$$。

『伍』 K-means聚類分析案例(二)

之前的筆記:
聚類介紹: 點這里
層次聚類分析案例(一):世界銀行樣本數據集
層次聚類分析案例(二):亞馬遜雨林燒毀情況
層次聚類分析案例(三):基因聚類
K-means聚類分析案例(一)

K-means聚類案例(二)食品

我們所吃的食物中的營養成分可以根據它們在構建身體構成的作用來分類。這些營養元素可分為宏量營養元素和微量元素。一些宏量營養元素包括碳水化合物、蛋白質、脂肪,一些微量元素的例子是維生素、礦物質和水。

准備工作

讓我們從准備數據開始。

第1步:收集和描述數據

為了應用k均值聚類,我們使用采自不同食物種類的數據集進行實驗,其中包含了每種食物各自的能量(Energy)、蛋白質(Protein)、脂肪(Fat)、鈣(Calcium)、鐵(Iron)等含量。 數據獲取

其中數值型變數如下:
Energy
Protein
Fat
Calcium
Iron
非數值型變數如下:
Food

具體實施步驟
以下為實現細節。

第2步:探索數據

載入cluster()庫。

探索數據並理解數據變簡枝量間的關系。從導入名為foodstuffs.txt的文本文件開始,將其保存在food.energycontent數據框中。

head()函數返迴向量、矩陣、表、數據框或函數的首尾部分。將food.energycontent數據框傳入head()函數:

結果如下:

str()函數返回food.energycontent數據框的結構殲唯信息。結果簡潔地顯示了其內部結構。

str(food.energycontent)

結果如下:

第3步:轉換數據

apply()函數執行了數據框和矩陣中逐個元素的數據變換。它返回一個向量、數組、鏈表,其中的值是通過應用一個函數到一個數組或矩陣的邊緣。其中2代表了函數要應用的列下標。sd是標准差函數,用於這個數據框。

結果如下:

sweep()函數返回一個數組,從一個輸入數組中清除一些統計信息。food.energycontent[,-1]作為一個數組傳入。其中2代表了函數要應用的列下標。standard.deviation是需要被清除的統計信息。

結果如下:

第4步:聚類

kmeans()函數施行k均值聚類到數據矩陣上。數據矩陣foodergycnt.stddev被當作一個對象傳入,該對象是一個數值型矩陣。centers=5代表初始的簇中心數量。iter.max=100代表最大的迭代輪數。因為簇數量由一個數字指定,nstart=25定義了隨機被指定的組數量。

結果如下:

指定4個中心簇:

結果如下:

輸出4個簇的聚類向量,結果如下:

接下來,輸出4個聚類方案的聚類以及食品標簽。

lapply()函數返回一個與X同樣長度的鏈表:

結果如下:

第5步:可視化聚類結果

使用pair()函數生成一個散點圖矩陣。

food.energycontent[,-1]通過給定一個矩陣或數據框的數值來提供點的坐標。

結果如下:

princomp()函數在給定數值型數據矩陣上進行攔改敏主成分分析。該函數產生了非旋轉的主成分分析結果。cor=T代表一個邏輯值,指明了計算需要使用相關矩陣。

par()函數整合多個繪圖結果到一個統一的圖中。s產生一個正方形繪圖區域。

par(pty="s")

繪制這個聚類:

結果如下:

『陸』 K-means原理、優化、應用

K-Means演算法是無監督的聚類演算法,它實現起來比較簡單,聚類效果也不錯,因此應用很廣泛。K-Means演算法有大量的變體,本文就從最傳統的K-Means演算法講起,在其基礎上講述K-Means的優化變體方法。包括初始化優化K-Means++, 距離計算優化elkan K-Means演算法和大數據情況下的優化Mini Batch K-Means演算法。

    K-Means演算法的思想很簡單,對於給定的樣本集,按照樣本之間的距離大小,將樣本集劃分為K個簇。讓簇內的點盡量緊密的連在一起,而讓簇間的距離盡量的大。

1、隨機選擇K個聚類的初始中心。

2、對任意一個樣本點,求其到K個聚類中心的距離,將樣本點歸類到距離最小的中心的聚類。

3、每次迭代過程中,利用均值等方法更新各個聚類的中心點(質心)。

4、對K個聚類中心,利用2、3步迭代更新後,如果位置點變化很小(可以設置閾值),則認為達到穩定狀態,迭代結束。(畫圖時,可以對不同的聚類塊和聚類中心可選擇不同的顏色標注)

1、原理比較簡單,實現也是很容易,收斂速度快。 

2、聚類效果較優。 

3、演算法的可解釋度比較強。 

4、主要需要調參的參數僅僅是簇數k。

1、K值的選取不好把握 

2、對於不是凸的數據集比較難收斂 

3、如果各隱含類別的數據不平衡,比如各隱含類別的數據量嚴重失衡,或者各隱含類別的方差不同,則聚類效果不佳。 

4、 最終結果和初始點的選擇有關,容易陷入局部最優。

5、對噪音和異常點比較的敏感。

    解決K-Means演算法對 初始簇心 比較敏感的問題,二分K-Means演算法是一種弱化初始質心的一種演算法。

1、將所有樣本數據作為一個簇放到一個隊列中。

2、從隊列中選擇一個簇進行K-Means演算法劃分,劃分為兩個子簇,並將子簇添加到隊列中。

3、循環迭代步驟2操作,直到中止條件達到(聚簇數量、最小平方誤差、迭代次數等)。

4、隊列中的簇就是最終的分類簇集合。

從隊列中選擇劃分聚簇的規則一般有兩種方式;分別如下:

1、對所有簇計算誤差和SSE(SSE也可以認為是距離函數的一種變種),選擇SSE最大的聚簇進行劃分操作(優選這種策略)。

2、選擇樣本數據量最多的簇進行劃分操作:

    由於 K-means 演算法的分類結果會受到初始點的選取而有所區別,因此有提出這種演算法的改進: K-means++ 。

    其實這個演算法也只是對初始點的選擇有改進而已,其他步驟都一樣。初始質心選取的基本思路就是, 初始的聚類中心之間的相互距離要盡可能的遠 。

1、隨機選取一個樣本作為第一個聚類中心 c1;

2、計算每個樣本與當前已有類聚中心最短距離(即與最近一個聚類中心的距離),用 D(x)表示;這個值越大,表示被選取作為聚類中心的概率較大;最後,用輪盤法選出下一個聚類中心。

3、重復步驟2,知道選出 k 個聚類中心。

4、選出初始點(聚類中心),就繼續使用標準的 k-means 演算法了。

盡管K-Means++在聚類中心的計算上浪費了很多時間,但是在迭代過程中,k-mean 本身能快速收斂,因此演算法實際上降低了計算時間。

      解決K-Means++演算法缺點而產生的一種演算法;主要思路是改變每次遍歷時候的取樣規則,並非按照K-Means++演算法每次遍歷只獲取一個樣本,而是每次獲取K個樣本,重復該取樣操作O(logn)次 (n是樣本的個數) ,然後再將這些抽樣出來的樣本聚類出K個點,最後使用這K個點作為K-Means演算法的初始聚簇中心點。實踐證明:一般5次重復採用就可以保證一個比較好的聚簇中心點。

1、在N個樣本中抽K個樣本,一共抽logn次,形成一個新的樣本集,一共有Klogn個數據。

2、在新數據集中使用K-Means演算法,找到K個聚簇中心。

3、把這K個聚簇中心放到最初的樣本集中,作為初始聚簇中心。

4、原數據集根據上述初始聚簇中心,再用K-Means演算法計算出最終的聚簇。

        Canopy屬於一種『粗』聚類演算法,即使用一種簡單、快捷的距離計算方法將數據集分為若干可重疊的子集canopy,這種演算法不需要指定k值、但精度較低,可以結合K-means演算法一起使用:先由Canopy演算法進行粗聚類得到k個質心,再使用K-means演算法進行聚類。

 1、將原始樣本集隨機排列成樣本列表L=[x1,x2,...,xm](排列好後不再更改),根據先驗知識或交叉驗證調參設定初始距離閾值T1、T2,且T1>T2 。

2、從列表L中隨機選取一個樣本P作為第一個canopy的質心,並將P從列表中刪除。

3、從列表L中隨機選取一個樣本Q,計算Q到所有質心的距離,考察其中最小的距離D:

如果D≤T1,則給Q一個弱標記,表示Q屬於該canopy,並將Q加入其中;

如果D≤T2,則給Q一個強標記,表示Q屬於該canopy,且和質心非常接近,所以將該canopy的質心設為所有強標記樣本的中心位置,並將Q從列表L中刪除;

 如果D>T1,則Q形成一個新的聚簇,並將Q從列表L中刪除。

4、重復第三步直到列表L中元素個數為零。

1、『粗』距離計算的選擇對canopy的分布非常重要,如選擇其中某個屬性、其他外部屬性、歐式距離等。

2、當T2<D≤T1時,樣本不會從列表中被刪除,而是繼續參與下一輪迭代,直到成為新的質心或者某個canopy的強標記成員。

3、T1、T2的取值影響canopy的重疊率及粒度:當T1過大時,會使樣本屬於多個canopy,各個canopy間區別不明顯;當T2過大時,會減少canopy個數,而當T2過小時,會增加canopy個數,同時增加計算時間。

4、canopy之間可能存在重疊的情況,但是不會存在某個樣本不屬於任何canopy的情況。

5、Canopy演算法可以消除孤立點,即刪除包含樣本數目較少的canopy,往往這些canopy包含的是孤立點或噪音點。

    由於K-Means演算法存在初始聚簇中心點敏感的問題,常用使用Canopy+K-Means演算法混合形式進行模型構建。

1、先使用canopy演算法進行「粗」聚類得到K個聚類中心點。

2、K-Means演算法使用Canopy演算法得到的K個聚類中心點作為初始中心點,進行「細」聚類。

1、執行速度快(先進行了一次聚簇中心點選擇的預處理);

2、不需要給定K值,應用場景多。

3、能夠緩解K-Means演算法對於初始聚類中心點敏感的問題。

    Mini Batch K-Means演算法是K-Means演算法的一種優化變種,採用 小規模的數據子集 (每次訓練使用的數據集是在訓練演算法的時候隨機抽取的數據子集) 減少計算時間 ,同時試圖優化目標函數;Mini Batch K-Means演算法可以減少K-Means演算法的收斂時間,而且產生的結果效果只是略差於標准K-Means演算法。

1、首先抽取部分數據集,使用K-Means演算法構建出K個聚簇點的模型。

2、繼續抽取訓練數據集中的部分數據集樣本數據,並將其添加到模型中,分配給距離最近的聚簇中心點。

3、更新聚簇的中心點值。

4、循環迭代第二步和第三步操作,直到中心點穩定或者達到迭代次數,停止計算操作。

https://www.jianshu.com/p/f0727880c9c0

『柒』 K-Means聚類演算法

        所謂聚類演算法是指將一堆沒有標簽的數據自動劃分成幾類的方法,屬於無監督學習方法,這個方法要保證同一類的數據有相似的特徵,如下圖所示:

        根據樣本之間的距離或者說是相似性(親疏性),把越相似、差異越小的樣本聚成一類(簇),最後形成多個簇,使同一個簇內部的樣本相似度高,不同簇之間差異性高。

相關概念:

K值 :要得到的簇的個數

質心 :每個簇的均值向量,即向量各維取平均即可

距離量度 :常用歐幾里得距離和餘弦相似度(先標准化)

演算法流程:

1、首先確定一個k值,即我們希望將數據集經過聚類得到k個集合。

2、從數據集中隨機選擇k個數據點作為質心。

3、對數據集中每一個點,計算其與每一個質心的距離(如歐式距離),離哪個質心近,就劃分到那個質心所屬的集合。

4、把所有數據歸好集合後,一共有k個集合。然後重新計算每個集合的質心。

5、如果新計算出來的質心和原來的質心之間的距離小於某一個設置的閾值(表示重新計算的質心的位置變化不大,趨於穩定,或者說收斂),我們可以認為聚類已經達到期望的結果,演算法終止。

6、如果新質心和原質心距離變化很大,需要迭代3~5步驟。

K-Means採用的啟發式方式很簡單,用下面一組圖就可以形象的描述:

        上圖a表達了初始的數據集,假設k=2。在圖b中,我們隨機選擇了兩個k類所對應的類別質心,即圖中的紅色質心和藍色質心,然後分別求樣本中所有點到這兩個質心的距離,並標記每個樣本的類別為和該樣本距離最小的質心的類別,如圖c所示,經過計算樣本和紅色質心和藍色質心的距離,我們得到了所有樣本點的第一輪迭代後的類別。此時我們對我們當前標記為紅色和藍色的點分別求其新的質心,如圖d所示,新的紅色質心和藍色質心的位置已經發生了變動。圖e和圖f重復了我們在圖c和圖d的過程,即將所有點的類別標記為距離最近的質心的類別並求新的質心。最終我們得到的兩個類別如圖f。

坐標系中有六個點:

1、我們分兩組,令K等於2,我們隨機選擇兩個點:P1和P2

2、通過勾股定理計算剩餘點分別到這兩個點的距離:

3、第一次分組後結果:

        組A:P1

        組B:P2、P3、P4、P5、P6

4、分別計算A組和B組的質心:

        A組質心還是P1=(0,0)

        B組新的質心坐標為:P哥=((1+3+8+9+10)/5,(2+1+8+10+7)/5)=(6.2,5.6)

5、再次計算每個點到質心的距離:

6、第二次分組結果:

        組A:P1、P2、P3

        組B:P4、P5、P6

7、再次計算質心:

        P哥1=(1.33,1) 

        P哥2=(9,8.33)

8、再次計算每個點到質心的距離:

9、第三次分組結果:

        組A:P1、P2、P3

        組B:P4、P5、P6

可以發現,第三次分組結果和第二次分組結果一致,說明已經收斂,聚類結束。

優點:

1、原理比較簡單,實現也是很容易,收斂速度快。

2、當結果簇是密集的,而簇與簇之間區別明顯時, 它的效果較好。

3、主要需要調參的參數僅僅是簇數k。

缺點:

1、K值需要預先給定,很多情況下K值的估計是非常困難的。

2、K-Means演算法對初始選取的質心點是敏感的,不同的隨機種子點得到的聚類結果完全不同 ,對結果影響很大。

3、對噪音和異常點比較的敏感。用來檢測異常值。

4、採用迭代方法, 可能只能得到局部的最優解,而無法得到全局的最優解 。

1、K值怎麼定?

        答:分幾類主要取決於個人的經驗與感覺,通常的做法是多嘗試幾個K值,看分成幾類的結果更好解釋,更符合分析目的等。或者可以把各種K值算出的 E 做比較,取最小的 E 的K值。

2、初始的K個質心怎麼選?

        答:最常用的方法是隨機選,初始質心的選取對最終聚類結果有影響,因此演算法一定要多執行幾次,哪個結果更reasonable,就用哪個結果。 當然也有一些優化的方法,第一種是選擇彼此距離最遠的點,具體來說就是先選第一個點,然後選離第一個點最遠的當第二個點,然後選第三個點,第三個點到第一、第二兩點的距離之和最小,以此類推。第二種是先根據其他聚類演算法(如層次聚類)得到聚類結果,從結果中每個分類選一個點。

3、關於離群值?

        答:離群值就是遠離整體的,非常異常、非常特殊的數據點,在聚類之前應該將這些「極大」「極小」之類的離群數據都去掉,否則會對於聚類的結果有影響。但是,離群值往往自身就很有分析的價值,可以把離群值單獨作為一類來分析。

4、單位要一致!

        答:比如X的單位是米,Y也是米,那麼距離算出來的單位還是米,是有意義的。但是如果X是米,Y是噸,用距離公式計算就會出現「米的平方」加上「噸的平方」再開平方,最後算出的東西沒有數學意義,這就有問題了。

5、標准化

        答:如果數據中X整體都比較小,比如都是1到10之間的數,Y很大,比如都是1000以上的數,那麼,在計算距離的時候Y起到的作用就比X大很多,X對於距離的影響幾乎可以忽略,這也有問題。因此,如果K-Means聚類中選擇歐幾里德距離計算距離,數據集又出現了上面所述的情況,就一定要進行數據的標准化(normalization),即將數據按比例縮放,使之落入一個小的特定區間。

參考文章: 聚類、K-Means、例子、細節

閱讀全文

與kmeans演算法的簡單示例相關的資料

熱點內容
pdf列印底色去掉 瀏覽:443
java快遞介面 瀏覽:387
哪個app可以教新爸爸 瀏覽:210
如何查看伺服器系統版本信息 瀏覽:524
成都市土地出讓金演算法 瀏覽:702
鋼筋加密標記 瀏覽:575
ps中擴展功能在文件夾的什麼位置 瀏覽:903
雙極壓縮機為什麼要先高壓 瀏覽:527
蘋果手機伺服器填什麼 瀏覽:832
android移動動畫效果 瀏覽:691
電子和伺服器是什麼意思 瀏覽:691
phpurl中文亂碼問題 瀏覽:893
程序員那麼可愛大結局陸漓產子 瀏覽:538
java如何從雲伺服器讀取本地文件 瀏覽:924
壓縮空氣軟管製作方法 瀏覽:912
天河三號演算法 瀏覽:924
php隊列教程 瀏覽:632
洪水命令 瀏覽:530
安卓怎麼弄成蘋果在線 瀏覽:435
谷歌web伺服器地址 瀏覽:900