1. 程式人生 > >MatLab Kmeans聚類 詳細解析

MatLab Kmeans聚類 詳細解析

今天想使用一下matlab自帶的函式kmeans,看了官方例項還有網上的帖子,都是說的雲裡霧裡。

自己看懂之後,在這裡分享一下。

要點1. kmeans是以行為單位進行聚類的

要點2. kmeans聚類的單位應該是能夠標識這個點的特徵

            這裡解釋一下,如果對一個二維矩陣進行聚類,聚類的根據的是矩陣值的話,那麼這個值(一個數)就能夠標識這個點;如果對一張RGB影象進行聚類,那畫素點的RGB值(三個數)就能標識這個點。


所以,在聚類之前,應該reshape矩陣一下

。例如二維矩陣30*20,則reshape成600*1;RGB影象300*400*3,則reshape成120000*3。這樣[t1,t2]=kmeans(...),t1記錄的是每一行屬於的類別,t2記錄的是每個類的質心位置。再將t1 reshape為原矩陣的大小,就可以直觀的看到矩陣的每個區域都屬於哪些類了。


以上方法是根據數值聚類,如果想通過位置座標聚類,該怎麼辦呢?

很簡單,把kmeans(X,k)中的X替換為要聚類的全部座標就可以了。


以下附一個不錯的例子供參考https://blog.csdn.net/u012526003/article/details/50492404

inputImg = double(imread('ti.jpg'));
inputKmeans = reshape( inputImg , size(inputImg,1)*size(inputImg,2) , 3 );
outK = kmeans( inputKmeans , 3 );
outImg = zeros( size(inputImg) );
d = reshape( outK, size(inputImg,1), size(inputImg,2) );
for ii = 1:size(inputImg,1)
    for jj = 1:size(inputImg,2)
        outImg(ii,jj,d(ii,jj)) = 1;
    end
end
figure
imshow(outImg)