MatLab Kmeans聚類 詳細解析
阿新 • • 發佈:2019-01-05
今天想使用一下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)