1、k均值算法
给定样本集{,…,
},对其进行簇划分C={
,
,…,
},最小化均方误差:
其中,。
2、流程
(1)初始化簇中心
(2)簇划分
(3)求各自簇均值,作为新的簇中心
(4)判断是否有新的簇中心更新,如果有,则循环(2);如果无,则输出最终的簇中心和簇划分标签
3、matlab程序
function [label,c]=MyKMeansj(Data,k)
%Data 输入数据 m*n数据 m表示数据维 n表示特征维
%k 聚类数量
%label 聚类标签
%c 聚类中心
%% 初始化聚类中心
[m,n]=size(Data);
randam=randperm(m);
pos=randam(1:k);
c=Data(pos,:);%聚类中心
cNew=zeros(k,n);%新的聚类中心
label=zeros(m,1);%进行簇划分的标签标记
%%
iters=0;%查看更新了多少次
while 1
%% 簇划分
iters=iters+1;
clc;disp(iters);
Distance=zeros(m,k);
% repmat(Y', [1 m1])).^2)
for j=1:k%遍历所有测试样本,并根据与聚类中心的最小距离进行簇划分
y=c(j,:);
Distance(:,j)=(sum((Data-repmat(y, [m 1])).^2,2));%计算欧式距离的平方
end
[~,label]=min(Distance');
%% 寻找新的聚类中心
for i=1:k
pos=find(label==i);
cdata=Data(pos,:);
cNew(i,:)=sum(cdata)/length(pos);
end
%% 判断聚类中心是否有更新
num=length(find(cNew(:)~=c(:)));
if num==0%没有点不相同,就说明聚类中心更新之后和原中心一致
break;
else
c=cNew;
end
end
end
参考自周志华《机器学习》