聚類算法是給一大堆原始數(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