[Matlab] K均值聚类

算法参见

http://cs229.stanford.edu/notes/cs229-notes7a.pdf


function y=K_mean(data,k)
[r,c]=size(data);                                 
%r : 数据的总数
%c: 每个数据的特征的个数
initcen=ones(k,c);        %预分配initial center
initcen_cur=initcen;     %           current initial center
dis=ones(r,k);              %           distance
diff=ones(k,1);            
for i=1:k
    initcen(i,:)=data(ceil(r*rand),:);      %随机生成k个初始中心点,(在数据集中选取)
end
while sum(diff)>0.1
    for i=1:k
        initvec=ones(r,1)*initcen(i,:);                 %将k个中心点扩展为r*c的矩阵
        for j=1:r
            dis(j,i)=norm(data(j,:)-initvec(j,:));      %dis是r*k 矩阵,每个数据到每个中心点的距离
        end
    end
    [minval,tag]=min(dis');    %min按列找最小值
    data_tag=[data,tag'];      %给data增加一个tag的维度,即(c+1)列
    for i=1:k
         initcen_cur(i,:)=mean(data(find(data_tag(:,c+1)==i),:));
         diff(i,:)= sum(abs(initcen_cur(i,:)-initcen(i,:)));
    end
    initcen=initcen_cur;        %循环迭代
end
y=[initcen,[1:k]'];                 %第c+1列为最后收敛中心的标号

[100,3]=size(data)

k=3

数据测试


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值