我的 kmeans matlab 代码

最近,接触了一下聚类算法。其中最简单最经典的莫过于 kmeans 算法。我了解了算法之后,着手编写了 matlab 代码。我的代码只有20几行,比起网上的很多代码都要简洁。

function [cls,ctr]=kmeans(data,K,tol)
% Kmeans
% input: data K tol
% output: cls: clusters, ctr: centroids
% example:
% data=rand(100,2);
% K=4;tol=0.01;
% [cls,ctr]=kmeans(data,K,tol);
% clr=['r','k','g','b'];
% for k=1:K
%    plot(cls{k}(:,1),cls{k}(:,2),[clr(k),'o']);hold on;    
%    plot(ctr(k,1),ctr(k,2),[clr(k),'+']);hold on;
% end


if nargin<=2,tol=0;
end


ctr=data(1:K,:);
N=size(data,1);
while 1
    % Assignment step
    cls=cell(1,K);                % K clusters
    for l=1:N
        dl=data(l,:);
        d=norm(dl-ctr(1,:));ind=1;
        for k=2:K
            if norm(dl-ctr(k,:))<d,
                ind=k;d=norm(dl-ctr(k,:));
            end
        end
        cls{ind}=[cls{ind};dl];   % data l is in ind-th cluster
    end
    
    % Update step
    S=0;
    for k=1:K                     % calculate new centroids
        newctr(k,:)=mean(cls{k});
        S=S+norm(newctr(k,:)-ctr(k,:));
    end
    
    ctr=newctr;                   % update the centroids
    if S<=tol,
        break;
    end
end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值