聚类算法之k均值算法+实例程序

看完周志华老师的《机器学习》中关于聚类算法k均值算法的介绍,根据书上的介绍,自己用MATLAB编了程序,并与网上找的程序作了比较,比网上的运行更快一些。

数据采用《机器学习》书P202页的西瓜数据集,根据P203的算法逻辑编程。

程序的流程图如下

MATLAB程序如下:

%N是数据一共分多少类
%data是输入的不带分类标号的数据
%u是每一类的中心
%re是返回的带分类标号的数据
clc,clear
data1=[0.697,0.774 0.634 0.608 0.556 0.403 0.481 0.437 0.666 0.243 0.245 0.343 0.639 0.657 0.36 0.593 0.719 0.359 0.339 0.282 0.748 0.714 0.483 0.478 0.525 0.751 0.532 0.473 0.725 0.446];

data2=[0.460 0.376 0.264 0.318 0.215 0.237 0.149 0.211 0.091 0.267 0.057 0.099 0.161 0.198 0.37 0.042 0.103 0.188 0.241 0.257 0.232 0.346 0.312 0.437 0.369 0.489 0.472 0.376 0.445 0.459];
data=[data1' data2'];

%显示数据
plot(data(:,1),data(:,2),'+');
grid on;
axis([0.1 0.9 0 0.8])

[m n]=size(data);   %m是数据个数,n是数据维数

N=3;    %分类数

num_diedai=5000;    %迭代次数最多为5000次
%随机初始化,从data数据里随机选取
u=data(randi([1 m],N,1),:);
u=[0.403 0.237;0.343 0.099 ;0.478 0.437];
goal_u=u;
tic
%加上迭代次数的限制条件
num=0;%迭代次数
while 1
    sign=0; %表示u是否还会更新
    for i=1:m
        for j=1:N
            d(i,j)=norm(data(i,:)-u(j,:));
        end
    end
    [d_min,order]=min(d,[],2);
    
    cu=zeros(m,N);
    for i=1:m
        cu(i,order(i))=1;
    end
    
    for j=1:N
        for i=1:n
            u(j,i)=sum(data(:,i).*cu(:,j))/sum(cu(:,j));
            
            if u(j,i)~=goal_u(j,i)
                goal_u(j,i)=u(j,i);
                sign=sign+1;
            end
        end
    end
    
    %不断迭代直到位置不再变化
    if sign==0
        break;
    elseif num>num_diedai & ~isnan(u)
        break;
    end
end

%将原始输入数据进行分类
re=[];
for i=1:m
    tmp=[];
    for j=1:N
        tmp=[tmp norm(data(i,:)-u(j,:))];
    end
    [junk index]=min(tmp);  %对每一行数据判断属于哪一类别
    re=[re;data(i,:) index];
end

hold on;
for i=1:m
    if re(i,3)==1
        plot(re(i,1),re(i,2),'ro');
    elseif re(i,3)==2
        plot(re(i,1),re(i,2),'go');
    else
        plot(re(i,1),re(i,2),'bo');
    end
end
grid on;toc
 

程序运行时间为:

时间已过 0.023202 秒。

运行结果图示:

和书上结果一致,以下链接是我将以上程序打包成函数程序,方便大家直接在主程序中调用。

打包好的函数程序

  • 11
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
k均值聚类算法是一种常用的无监督学习算法,其主要目的是对数据进行聚类分析。以下是k均值聚类算法的一个应用实例: 假设我们有一个数据集,其中包含一些水果的属性数据,如重量、大小和颜色等。我们希望将这些水果分成两个簇,一簇是红色水果,另一簇是黄色水果。我们可以使用k均值聚类算法来完成这个任务。 首先,我们需要将这些水果的属性数据转换成一个特征向量,以便能够进行聚类分析。例如,我们可以将每个水果的重量、大小和颜色值作为特征向量的三个维度。 然后,我们需要选择k值,即希望将数据分成多少个簇。在这个例子中,我们选择k=2,因为我们希望将数据分成两个簇。 接下来,我们可以使用k均值聚类算法来对这些水果进行聚类分析。具体步骤如下: 1. 随机选择两个数据点作为初始的簇中心。 2. 对于每个数据点,计算其距离最近的簇中心,并将其分配到该簇中。 3. 对于每个簇,计算其所有数据点的平均值,并将该平均值作为新的簇中心。 4. 重复步骤2和步骤3,直到簇中心不再发生变化或达到最大迭代次数。 最终,我们将得到两个簇,一个是红色水果簇,另一个是黄色水果簇。我们可以根据簇的中心点和数据点的分配情况来确定每个水果的类别。 这就是k均值聚类算法的一个应用实例,它可以帮助我们对数据进行聚类分析,并从中发现一些有用的模式和趋势。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大宇进阶之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值