Clustering 中文翻譯作“聚類”,簡單地說就是把相似的東西分到一組,同 Classification (分類)不同,對於一個 classifier ,通常需要你告訴它“這個東西被分為某某類”這樣一些例子,理想情況下,一個 classifier 會從它得到的訓練集中進行“學習”,從而具備對未知數據進行分類的能力,這種提供訓練數據的過程通常叫做 supervised learning (監督學習)。而在聚類的時候,我們並不關心某一類是什么,我們需要實現的目標只是把相似的東西聚到一起,因此,一個聚類算法通常只需要知道如何計算相似 度就可以開始工作了,因此 clustering 通常並不需要使用訓練數據進行學習,這在 Machine Learning 中被稱作 unsupervised learning (無監督學習)。
在數據挖掘中, k-means聚類算法是一種 cluster analysis (聚類分析)的算法,是一種非常簡單地基於距離的聚類算法,認為每個Cluster(類)由相似的點組成而這種相似性由距離來衡量,不同Cluster間的點應該盡量不相似,每個Cluster都會有一個“重心”;另外它也是一種排他的算法,即任意點必然屬於某一Cluster且只屬於該Cluster。
這個算法實現過程很簡單,如下圖所示:
上圖中,A, B, C, D, E 是五個在圖中點。而灰色的點是種子點,也就是用來找Cluster的“重心”。有兩個種子點,所以K=2。
k-means算法步驟:
典型的算法如下,它是一種迭代的算法:
(1)根據事先給定的k值建立初始划分,得到k個Cluster,比如,可以隨機選擇k個點作為k個Cluster的重心;
(2)計算每個點到各個Cluster重心的距離,將它加入到最近的那個Cluster;
(3)重新計算每個Cluster的重心;
(4)重復過程2~3,直到各個Cluster重心在某個精度范圍內不變化或者達到最大迭代次數。
別看算法簡單,很多復雜算法的實際效果或許都不如它,而且它的局部性較好,容易並行化,對大規模數據集很有意義;算法時間復雜度是:O(nkt),其中:n 是聚類點個數,k 是Cluster個數,t 是迭代次數。
k-means算法主要有兩個最重大的缺陷,都和初始值有關:
- K 是事先給定的,這個 K 值的選定是非常難以估計的。很多時候,事先並不知道給定的數據集應該分成多少個類別才最合適。( ISODATA 算法通過類的自動合並和分裂,得到較為合理的類型數目 K)
- K-Means算法需要用初始隨機種子點來搞,這個隨機種子點太重要,不同的隨機種子點會有得到完全不同的結果。(K-Means++算法可以用來解決這個問題,其可以有效地選擇初始點)
k-means算法C++實現:k-means.rar
GitHub代碼:https://github.com/luxiaoxun/KMeans-GMM-HMM
代碼來源於網絡,稍作修改,並做了簡單測試。