k均值算法是聚类分析算法里的其中一种,在若干数据集中,数据的某些属性具有较强的相似性,可以利用相似性将数据分成k类以达到所需的分类效果,在应用中,可作为对复杂数据的预处理,由于K均值算法是从无标注的数据中学习预测模型,本质上是学习数据中的潜在统计规律,也就属于无监督分类。
2.1 k均值算法的条件与约束
根据先验知识分析数据,内定类的数目K值。
2.2 基本思想
在数据中随机选取k个值分别作为k个类的聚类中心,计算数据到每个聚类中心的距离,按最小距离将数据分配到所匹配的类中,所有数据计算完以后,判断此次K类中的数据是否和上一次的数据相同,若相同则分类完毕,不相同则根据此时K类中的数据以求均值方式重新调整聚类中心,最终使各数据到所属聚类中心距离最小。
2.3 数据到每个聚类中心的距离计算法
可采用欧氏距离的平方作为数据到每个聚类中心的距离计算法
2.4 聚类中心的计算
可采用均值法求解聚类中心,设Kc={x1,x2,...xj}
[filen, pathn] = uigetfile({'*.data'},'请选择待处理数据');
if isequal(filen,0)
errordlg('没有选择文件.','温馨提示');
else
% [~,tname,~] = fileparts(filen);
filename = strcat(pathn,filen);
x=load(filename);%从文件中取数据
x=x';
[m,n]=size(x);
k=3;
G1=[];%暂存G1类
G2=[];%暂存G2类
G3=[];%暂存G3类
g1=[];%G1类
g2=[];%G2类
g3=[];%G3类
while isempty(g1)||(~(isequal(g1,G1))&&~(isequal(g2,G2))&&(~(isequal(g3,G3))))
G1=g1;
G2=g2;
G3=g3;
g=[];%存放类中心点
if isempty(g1)
g=x(1:2,1:3);%初次存放G1类、G2类、G3类的中心点
else
g=[g mean(G1,2)];
g=[g mean(G2,2)];
g=[g mean(G3,2)];
end
g1=[];
g2=[];
g3=[];
for i=1:n %遍历所有数据
min=(norm(g(1,1)-x(:,i)))^2;
t=1;%记录数据应该在哪个类里
for j=1:k %计算每个数据到类中心点的距离
distant=(norm(g(:,j)-x(:,i)))^2 ;
if(distant<min)
min=distant;
t=j;
end
end
if t==1
g1=[g1 x(:,i)];
elseif t==2
g2=[g2 x(:,i)];
elseif t==3
g3=[g3 x(:,i)];
end
end
end
figure('Name','欢迎关注matlab爱好者','Color','w')
plot(g1(1,:),g1(2,:),'r*');
hold on;
plot(g2(1,:),g2(2,:),'b*');
plot(g3(1,:),g3(2,:),'g*');
hold off;
title('K均值算法演示');
end
其中红绿蓝分别表示不同类
首先是基于无监督学习下划分的聚类方法,在先验的基础上事先内定k取值,k表示数据分为多少类,可用欧式距离的平方计算数据与类之间的距离,类中心可用均值法去求解,从数学角度讲是在优化函数(数据在所属类的距离总和),并且初次随机选择的类初始中心不同,得到的聚类分析也可能会不同。
参考资料:
[1] 现代模式识别(第二版) 孙即祥 著
[2] 统计学习方法(第二版) 李航 著