K均值聚类以及matlab实现

K均值聚类是最基础的一种聚类方法。K均值聚类,就是把看起来最集中、最不分散的簇标签这里写图片描述分配到输入训练样本这里写图片描述里。具体而言,通过下式计算簇y的分散情况。

这里写图片描述

在这里,这里写图片描述表示的是满足这里写图片描述的y的和。

这里写图片描述

上式的这里写图片描述为簇y的中心,这里写图片描述为属于簇y的样本总数。利用上述定义,对于所有的簇这里写图片描述的下式和为最小时,决定其所属的簇标签。

这里写图片描述

然而,上述的最优化过程的计算时间是随着样本数n的增加呈指数级增长的,当n为较大的数值的时候,很难对其进行高精度的求解。因此在实际应用中,一般是将样本逐个分配到距离其最近的聚类中,并重复进行这一操作,直到最终求得其局部最优解。

这里写图片描述

k-means算法流程如下所示:
1)给各个簇中心这里写图片描述以适当的初值。
2)更新样本这里写图片描述对应的簇标签这里写图片描述

这里写图片描述

3)更新各个簇中心这里写图片描述

这里写图片描述

上式中,这里写图片描述为属于簇y的样本总数。

4)直到簇标签达到收敛精度为止,重复上述2,3步的计算

matlab代码如下所示:

n = 300 ;
c = 3 ;
t = randperm(n) ;
%横坐标 + 纵坐标
x = [randn(1,n/3)-2 randn(1,n/3) randn(1,n/3)+2 ;
     randn(1,n/3) randn(1,n/3)+4 randn(1,n/3)]' ;

 %随机种子
 m = x(t(1:c),:) ;
 x2 = sum(x.^2,2) ;
 s0(1:c,1) = inf ;

 for o = 1 : 100
        m2 = sum(m.^2,2) ;
        % (a-b)^2 = a^2 + b^2 - 2 * a * b
        [d,y] = min(repmat(m2,1,n)+repmat(x2',c,1)-2*m*x') ;
        for t = 1 : c
            m(t,:) = mean(x(y==t,:)) ;
            s(t,1) = mean(d(y==t)) ;
        end
        % norm(A) 返回矩阵A的二范数
        % 矩阵的二范数 : A' * A 的最大特征值开平方
        % A = [0 1 2 ; 3 4 5 ; 6 7 8] ;
        % norm(A) = sqrt(max(eig(A'*A))) = 14.2267 
        if norm(s-s0) < 0.001 
            break ;
        end
        s0 = s ;
 end
 figure(1) ;
 clf ;
 hold on ;
 plot(x(y==1,1),x(y==1,2),'bo') ;
 plot(x(y==2,1),x(y==2,2),'rx') ;
 plot(x(y==3,1),x(y==3,2),'gv') ;

生成的图像如图所示。
这里写图片描述

在这个例子中,K均值聚类算法得到了较好的聚类结果。。。

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值