聚類算法之k-means的實現(xiàn)

聚類算法是給一大堆原始數(shù)據(jù),然后通過算法將其中具有相似特征的數(shù)據(jù)聚為一類。

k-means聚類,也叫k均值聚類,要先給出原始數(shù)據(jù)所含的類數(shù),然后將含有相似特征的數(shù)據(jù)聚為一個類中。并不需要關(guān)心某一類是什么,我們需要實現(xiàn)的目標(biāo)只是把相似的東西聚到一起,不需要使用訓(xùn)練數(shù)據(jù)進(jìn)行學(xué)習(xí),所以這屬于無監(jiān)督學(xué)習(xí)。

步驟一般如下:

1、從所以數(shù)據(jù)中隨機(jī)取k個元素,作為k個類的各自的中心。

2、分別計算剩下的元素到k個類中心的相異度(常用歐式距離),將這些元素分別劃歸到相異度最低(即距離最近)的類。

3、根據(jù)聚類結(jié)果,找到每一類的所有數(shù)據(jù),計算他們的平均值,作為下次計算的聚類中心。

4、將數(shù)據(jù)中全部元素按照新的中心重新聚類。

5、重復(fù)第4步,直到聚類結(jié)果不再變化。

6、將結(jié)果輸出。

下面舉個實例:

啤酒根據(jù)發(fā)酵方式分為三大類:

淡色啤酒,濃色啤酒,黑啤酒,其他啤酒對以下數(shù)據(jù)進(jìn)行聚類

clear all

clc

data=[144.00 19.00 4.70 ;

181.00 19.00 4.90 ;

157.00 15.00 4.90 ;

170.00 7.00 5.20 ;

152.00 11.00 5.00 ;

145.00 23.00 4.60 ;

175.00 24.00 5.50 ;

149.00 27.00 4.70 ;

99.00 10.00 4.30 ;

113.00 6.00 3.70 ;

140.00 16.00 4.60 ;

102.00 15.00 4.10 ;

135.00 11.00 4.20 ;

150.00 19.00 4.70 ;

149.00 6.00 5.00 ;

68.00 15.00 2.30 ;

136.00 19.00 4.40 ;

144.00 24.00 4.90 ;

72.00 6.00 2.90 ;

97.00 7.00 4.20 ];

% data=[data1;data2;data3;data4];

[row,col] = size(data);

K = 4;

max_iter = 300;%%迭代次數(shù)

min_impro = 0.1;%%%%最小步長

display = 1;%%%判定條件

center = zeros(K,col);

U = zeros(K,col);

%% 初始化聚類中心

mi = zeros(col,1);

ma = zeros(col,1);

for i = 1:col

mi(i,1) = min(data(:,i));

ma(i,1) = max(data(:,i));

center(:,i) = ma(i,1) - (ma(i,1) - mi(i,1)) * rand(K,1);

end

%% 開始迭代

for o = 1:max_iter

%% 計算歐氏距離,用norm函數(shù)(即向量每個元素分別平方后求和再開方)

for i = 1:K

dist{i} = [];

for j = 1:row

dist{i} = [dist{i};data(j,:) - center(i,:)];

end

end

minDis = zeros(row,K);

for i = 1:row

tem = [];

for j = 1:K

tem = [tem norm(dist{j}(i,:))];

end

[nmin,index] = min(tem);

minDis(i,index) = norm(dist{index}(i,:));

end

%% 更新聚類中心

for i = 1:K

for j = 1:col

U(i,j) = sum(minDis(:,i).*data(:,j)) / sum(minDis(:,i));

end

end

%% 判定

if display

end

if o >1,

if max(abs(U - center)) < min_impro;

break;

else

center = U;

end

end

end

%% 返回所屬的類別

class = [];

for i = 1:row

dist = [];

for j = 1:K

dist = [dist norm(data(i,:) - U(j,:))];

end

[nmin,index] = min(dist);

class = [class;data(i,:) index];

end

%% 顯示最后結(jié)果

[m,n] = size(class);

figure;

title('聚類結(jié)果');

hold on;

for i=1:row

if class(i,end)==1

plot3(class(i,1),class(i,2),class(i,3),'ro');

elseif class(i,end)==2

plot3(class(i,1),class(i,2),class(i,3),'go');

elseif class(i,end) == 3

plot3(class(i,1),class(i,2),class(i,3),'bo');

end

end

grid on;

得到結(jié)果:

這20種啤酒分別屬于類別1,2,1,2,1,1,2,1,3,4,1,3,4,1,1,3,1,1,3,3

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,899評論 0 33
  • 回溯算法 回溯法:也稱為試探法,它并不考慮問題規(guī)模的大小,而是從問題的最明顯的最小規(guī)模開始逐步求解出可能的答案,并...
    fredal閱讀 13,993評論 0 89
  • Java經(jīng)典問題算法大全 /*【程序1】 題目:古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子...
    趙宇_阿特奇閱讀 2,075評論 0 2
  • 仿佛是一夜間 冷秋覆蓋了炎夏 不知哪個方向的風(fēng) 捎帶著寒意 封鎖了葉面上濃郁的綠 正午囂張的悶熱 亦或是夜幕下 讓...
    夏夜冬日閱讀 269評論 2 1
  • 主講老師:高志鵬 解決問題的關(guān)鍵因素方法、合作、經(jīng)驗。 問題解決模型的四大板塊Pass:問題界定,原因分析,方案確...
    商凌云閱讀 423評論 1 2

友情鏈接更多精彩內(nèi)容