matlab实现k-l算法,K均值聚类算法的MATLAB实现

K-means算法是最简单的一种聚类算法。算法的目的是使各个样本与所在类均值的误差平方和达到最小(这也是评价K-means算法最后聚类效果的评价标准)

K-means聚类算法的一般步骤:

初始化。输入基因表达矩阵作为对象集X,输入指定聚类类数N,并在X中随机选取N个对象作为初始聚类中心。设定迭代中止条件,比如最大循环次数或者聚类中心收敛误差容限。

进行迭代。根据相似度准则将数据对象分配到最接近的聚类中心,从而形成一类。初始化隶属度矩阵。

更新聚类中心。然后以每一类的平均向量作为新的聚类中心,重新分配数据对象。

反复执行第二步和第三步直至满足中止条件。

K-均值聚类法的概述

之前在参加数学建模的过程中用到过这种聚类方法,但是当时只是简单知道了在matlab中如何调用工具箱进行聚类,并不是特别清楚它的原理。最近因为在学模式识别,又重新接触了这种聚类算法,所以便仔细地研究了一下它的原理。弄懂了之后就自己手工用matlab编程实现了,最后的结果还不错,嘿嘿~~~

简单来说,K-均值聚类就是在给定了一组样本(x1, x2, 。。.xn) (xi, i = 1, 2, 。。。 n均是向量) 之后,假设要将其聚为 m(《n) 类,可以按照如下的步骤实现:

Step 1: 从 (x1, x2, 。。.xn) 中随机选择 m 个向量(y1,y2,。。.ym) 作为初始的聚类中心(可以随意指定,不在n个向量中选择也可以);

Step 2: 计算 (x1, x2, 。。.xn) 到这 m 个聚类中心的距离(严格来说为 2阶范数);

Step 3: 对于每一个 xi(i = 1,2,。。.n)比较其到 (y1,y2,。。.ym) 距离,找出其中的最小值,若到 yj 的距离最小,则将 xi 归为第j类;

Step 4: m 类分好之后, 计算每一类的均值向量作为每一类新的聚类中心;

Step 5: 比较新的聚类中心与老的聚类中心之间的距离,若大于设定的阈值,则跳到 Step2; 否则输出分类结果和聚类中心,算法结束。

单介绍下kmeans算法流程:

假设要把样本集分为c个类别,算法描述如下:

(1)适当选择c个类的初始中心;

(2)在第k次迭代中,对任意一个样本,求其到c各中心的距离,将该样本归到距离最短的中心所在的类;

(3)利用均值等方法更新该类的中心值;

(4)对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代。

该算法的最大优势在于简洁和快速。算法的关键在于初始中心的选择和距离公式。

matlab实现:

funcTIon [ class count]=k_means(data,k);

%clear

%load testdata.mat

%k=2;

sum=size(data,1);

for i=1:k

centroid(i,:)=data(floor(sum/k)*(i-1)+1,:);

end

ck=0;

while 1

temp=zeros(1,2);;

count=zeros(1,k);

ck=ck+1

for i=1:sum

for j=1:k

dist(j)=norm(data(i,:)-centroid(j,:));

end

[a min_dist]=min(dist);

count(min_dist)=count(min_dist)+1;

class(min_dist,count(min_dist))=i;

end

%重新计算类中心

for i=1:k

for j=1:count(i)

temp=temp+data(class(i,j),:);

end

temp_centroid(i,:)=temp/(count(i));

temp(1,:)=0;

% temp_centroid(i,:)=re_calculate(class(i,:),count(i),tdata);

end

%计算新的类中心和原类中心距离centr_dist;

for i=1:k

centr_dist(i)=norm(temp_centroid(i,:)-centroid(i,:));

end

if max(centr_dist)《=0

break;

else

for i=1:k

centroid(i,:)=temp_centroid(i,:);

%重新进行前俩不

end

end

end

toc

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值