聚类

1  聚类

聚类是无监督学习(unsupervised learning)的一种,主要是通过对未标记的样本的学习,揭示数据的内部内在性质和规律。

聚类的形式化定义(来自周志华的《机器学习》)

聚类_第1张图片


2  k均值算法

k均值算法的描述:

聚类_第2张图片

西瓜书中有个例子,样本集:

聚类_第3张图片

书上给出了对k均值算法的详细描述:

聚类_第4张图片


3  matlab代码实现

(参考http://www.cnblogs.com/tiandsp/archive/2013/04/24/3040883.html)

clear all;
close all;
clc;

data1 = xlsread('melon.xls','B:B') %desity of watermelon
data2 = xlsread('melon.xls','C:C') %sugar content of watermelon
data = [data1,data2]

%k-means聚类
KMeans(data,3);  %最后产生带标号的数据,标号在所有数据的最后,意思就是数据再加一维度

调用的函数

function [u re] = KMeans(data,N)   %N是数据分为类数,data是输入数据,u是每类均值
    [m n]=size(data);   %m是数据个数30,n是数据维数2
    u(1,:) = data(6,:);
    u(2,:) = data(12,:);
    u(3,:) = data(27,:);
    num = 1;
    while 1
  %%
        pre_u=u;            %上一次求得的中心位置
        for i=1:N
            tmp{i}=[];     
            for j=1:m   %m=30
                tmp{i}=[tmp{i};data(j,:)-u(i,:)];%所有样本与3个均值向量的差,分别存在三个元胞中
            end
        end
        
        quan=zeros(m,N);%30*3
        re=[];
        for i=1:m        %m=30
            c=[];
            for j=1:N
                c=[c norm(tmp{j}(i,:))];
            end
            [junk,index]=min(c); %junk是c中最小的值,index是c中最小值的索引,与3个均值向量最小的2范数
            quan(i,index)=1;      %将quan的第i行第index列设置了c中最小的值   
            re=[re;data(i,:) index];       
        end
        
 %%
            [m k]=size(re);
            %最后显示聚类后的数据
            figure;
            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'); 
                elseif re(i,3)==3 
                     plot(re(i,1),re(i,2),'bo');  
                end
            end
            grid on;
 %%       
        for i=1:N            %求出新的均值向量
           for j=1:n    %n是数据维数2
                u(i,j)=sum(quan(:,i).*data(:,j))/(length(find(quan(:,i))==1));
           end           
        end
        fprintf('%d ',num);
        num = num + 1; %不能用像c的num++形式
        if (pre_u == u)  %不断迭代直到位置不再变化
            break;
        end
   end

4  运行结果

(周志华的《机器学习》书中写了迭代了4次,但是我实验时只迭代了一次,网上也有人只迭代出了一次:https://segmentfault.com/q/1010000007634688,具体原因不知道)

聚类_第5张图片

你可能感兴趣的:(machine,learning)