一、聚類介紹
聚類分析是指事先不瞭解每一個樣本的類別或其他的先驗知識,而唯一的分類根據是樣本的特徵,利用某種相似度度量的方法,把特徵相同或相似的歸爲一類,實現聚類劃分,聚類是一種無監督分類方法。同一個聚合類中的模式比不同聚合類中的模式更相似,從而對模式間的相互關係做出估計。聚類分析的結果可以被用來對數據提出初始假設,分類新數據,測試數據的同類型及壓縮數據。
1、聚類的定義
在模式空間S中,若給定N個樣本X1,X2,...,XN,聚類的定義是:按照相互類似的程度找到相應的區域R1,R2,...,RM,對任意Xi(i=1,2,...,N)歸入其中一類,而且不會同時屬於兩類。
2、聚類準則
我們需要一種聚類準則來評判聚類的優劣,以便知道我們的聚類結果是否足夠好。聚類的優劣是就某一種評價準則而言,很難有對各種準則都表現優良的聚類方法。
聚類準則的確定基本上有兩種方法:
(1)試探法:根據所分類的問題,確定一種準則,並用它來判斷樣本分類是否合理。例如,以距離函數作爲相似性的度量,用不斷修改的閾值來探究對此種準則的滿足程度,當取得極小值時,就認爲得到了最佳劃分。基於試探的聚類算法包括最臨近規則的試探法、最大最小距離試探法和層次聚類試探法。
(2)規定一種準則函數,其函數值與樣本的劃分有關,當取得極小值時,就認爲得到了最佳劃分。
有一種簡單而又廣泛應用的準則,即誤差平方和準則:
設有N個樣本,分別屬於類,設有Ni個樣本的類,其均值爲
然後求所有簇的誤差平方和:
我們有很多種聚類方法可以將N個樣本劃分爲M類,但是我們想要找到能使J值最小的那種方法。
經驗表明,當各類樣本都很密集,各類樣本個數相差不大,而類間距離較大時,適合採用誤差平方和準則。若各類樣本數相差很大,類間距較小時,就有可能將樣本數多的類一分爲二,而得到的J值卻比只有一類時更小,誤以爲得到了更優的劃分,實際上是錯誤的劃分。
常用的聚類方法有均值聚類、分層聚類和模糊聚類。
二、Kmeans方法介紹
K均值聚類,也叫K-means,它是一種迭代的改進探索法。基本思想是:首先把輸入點分爲K個初始化組,可以使用隨機或者一些啓發式數據,然後計算每組的中心點,根據中心點的位置把樣本分到離他最近的中心,重新確定分組,再繼續重複不斷地計算中心並重新分組,直到樣本不再改變分組(中心點位置不再改變)。
Kmeans的聚類準則函數是上面提到的誤差平方和準則。
1、Kmeans算法基本步驟:
(1)有N個樣本,用I表示迭代次數,初始I=1,若已知樣本分屬於K個類,選取K個初始聚合中心。
(2)計算每個樣本到聚合中心的距離
然後取距離最短的那個中心點所在的類別作爲該樣本的類別。
(3)計算K個新的聚合中心:
(4)若,則I=I+1,返回(2);否則,算法結束。
可以看到上面的算法步驟裏面其實並沒有使用誤差平方和準則來決定算法是否該結束,而是根據中心點位置是否發生變化來決定。
接下來介紹初始分類的選取和調整的方法:
(1)成批處理法:先在樣本中選取一批中心點,計算其他樣本到中心點的距離,把樣本歸於最近的中心點,形成初始分類,再重新計算各中心。這種方法在每次計算各類中心點時所有樣本都會參與計算。上面的方法就是這種。
(2)逐個處理法:先在樣本中選取一批中心點,當計算完第一個樣本時,把它歸爲最近的一類,形成新的分類,然後基於目前已經歸好類的樣本重新計算新的中心點,然後再計算第二個樣本,對其歸類。這種方法在每個樣本歸類後都會改變聚類中心,相比成批處理法在所有樣本都歸類後再計算新的中心點,這種方法則是在一個樣本歸類後就馬上基於現有已經歸類的樣本計算新的中心點。
2、最佳初始分類K的選取
如果我們沒有事先知道樣本有多少類,那我們如何確定K呢?
我們可以令K逐漸增加,然後根據誤差平均和來判斷算法是否該停止。使用Kmeans,誤差平均和J會隨着K的增加而單調減少。最初由於K較小,隨着K增大J會迅速減少,但當K增加到一定數值時,J的減少速度會變慢。我們將J的減少速度變緩慢的那個點稱爲拐點,在拐點處的K值就是最佳初始分類。
這個圖也叫“肘子圖”,在“肘子”那裏就是拐點。
3、Kmeans的優缺點
優點:
(1)如果變量很大,Kmeans比層次聚類的計算速度更快
(2)與層次聚類相比,K均值可以得到更緊密的簇,尤其是對於球狀簇
(3)大數據集合效率比較高
(4)當結果簇是密集的,簇與簇之間區別明顯時效果較好
缺點:
(1)依賴K的初始值: K對最終結果的影響至關重要,經常發生得到次優劃分的情況。給定合適的 K值,需要先驗知識,且多次嘗試不同的初始值。
(2)依賴初始中心點的選擇:聚類結果受初始中心點的影響很大,不同的初始點選擇會導致截然不同的結果,並且當按最近鄰歸類時,如果遇到與兩個中心點距離相等的情況,不同的選擇也會造成不同的結果。可以採用多次初始化來獲得更好的結果。
(3)對噪聲和離羣點敏感:這類數據能夠對誤差平均和產生極大的影響。
三、matlab中使用kmeans函數對數據進行聚類
以下是《模式識別與人工智能(基於matlab)》的一段代碼
clear all;
clc;
% 加載樣本dataset,包含訓練數據和測試數據,數據shape爲[樣本數,特徵維數] %%
% 樣本一共有4類
load('dataset.mat');
data = [A_test;B_test;C_test;D_test];
% 調用kmeans函數進行聚類分析
[IDX,C,SUMD,D] = kmeans(data,4); % K=4
% IDX:聚類結果
% C:聚類中心
% SUMD:每一個樣本到該聚類中心的距離和
% D:每一個樣本到各個聚類中心的距離
plot3(data(:,1),data(:,2),data(:,3),'*');
grid;
D = D';
minD=min(D);
index1 = find(D(1,:) ==min(D))
index2 = find(D(2,:) ==min(D))
index3 = find(D(3,:) ==min(D))
index4 = find(D(4,:) ==min(D))
line(data(index1,1),data(index1,2),data(index1,3),'linestyle', 'none','marker','*','color','g');
line(data(index2,1),data(index2,2),data(index2,3),'linestyle', 'none','marker','*','color','r');
line(data(index3,1),data(index3,2),data(index3,3),'linestyle', 'none','marker','+','color','b');
line(data(index4,1),data(index4,2),data(index4,3),'linestyle', 'none','marker','+','color','y');
title('Kmeans聚類圖');
xlabel('第一特徵座標');
ylabel('第二特徵座標');
zlabel('第三特徵座標');
聚類結果圖:
命令行窗口的輸出:
index1 =
12 13 14 15 17 18 19 20 21 22 23 24
index2 =
6 7 8 9 10 11
index3 =
25 26 27 28 29 30
index4 =
1 2 3 4 5 16
更多的Kmeans改進方法推薦看這篇文章:KMeans 算法(一)