无监督学习——K均值理论及matlab代码

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
 

 

 

参考自周志华《机器学习》

你可能感兴趣的:(无监督,K均值聚类,机器学习)