硬C均值聚类

简介

     硬C-均值(HCM)是一种典型的无监督学习算法,主要将相似的样本自动的归为一类,事先确定好常数K,常数K意味着最终聚类的类别个数。通过计算每个样本到质心之间的相似度,将样本归到相似的类中。在分类过程中每次都要计算所有样本到质心的距离,在大规模数据上,该算法的收敛速度比较慢。

思想

硬聚类分析的目标如下所示:

式子中,dik表示第i类中的样本xk与第i类样本之间的失真度,经常用两个矢量间的距离来度量。J1 (U,P)表示了各类中样本与其典型样本的误差平方和。聚类准则就是寻找最佳组队(U,P),使得在满足约束uik∊Mhc条件下J1 (U,P)为最小。

算法步骤

1.  初始化常数K,随机选取K个初始值为质心。

2.  根据每个聚类对象的均值,计算对象与这些中心对象的距离;并根据最小距离重新对相应的对象进行划分;

3.  重新计算每个聚类的中心;

4.  计算标准化测度函数,当满足一定条件,如函数收敛,或者聚类中心不再变化,算法终止。


Matlab算法实现

clear all;close all;clc; 

%creat sample

mu1=[0,2];%均值

sigma1=[.1 0;0 .1];%协方差

data1=mvnrnd(mu1,sigma1,50)

 

mu2=[2,3];

sigma1=[.1 0;0 .1];

data2=mvnrnd(mu2,sigma1,50)%

 

mu3=[1.5,2];

sigma1=[.1 0;0 .1];

data3=mvnrnd(mu3,sigma1,50);

 

plot(data1(:,1),data1(:,2),'b+')

hold on

plot(data2(:,1),data2(:,2),'r+'); 

hold on

plot(data3(:,1),data3(:,2),'g+'); 

 

 

data = [data1;data2;data3]

N=4; %聚类的数目

 

[m,n]=size(data); 

pattern=zeros(m,n+1);  %n+1维为数据标签

center = zeros(N,n); %初始化聚类中心

pattern (:,1:n) = data(:,:);

%随机选取其中的N个数为聚类的中心

for x = 1:1:N

   center(x,:) = data(randi(m,1),:) ;

end

 

while 1

    distance = zeros(1,N);

    num = zeros(1,N); %

    new_center = zeros(N,n);

    

    for x = 1:1:m

        for y = 1:1:N

            distance(y) = norm(data(x,:)-center(y,:));%

        end

        [i,temp] = min(distance);

        pattern(x,n+1) = temp;

    end

   

    k=0;

    %计算聚类中心并判断是否迭代结束

    for y = 1:1:N

        for x = 1:1:m

            if pattern(x,n+1) == y

             new_center(y,:) = new_center(y,:)+pattern(x,1:n);

             num(y) = num(y)+1;

            end

        end

        new_center(y,:) = new_center(y,:)/num(y);

        if   norm(new_center(y,:)-center(y,:))<0.1

            k = k+1;

        end

    end

   

    if k == N

        break;

    else

        center = new_center;

    end

end

       

[m, n]=size(pattern); 

figure; 

hold on

for i=1:m 

    if pattern(i,n)==1  

         plot(pattern(i,1),pattern(i,2),'r*'); 

         plot(center(1,1),center(1,2),'ko'); 

    elseifpattern(i,n)==2 

         plot(pattern(i,1),pattern(i,2),'g*'); 

         plot(center(2,1),center(2,2),'ko'); 

    elseif pattern(i,n)==3 

         plot(pattern(i,1),pattern(i,2),'b*'); 

         plot(center(3,1),center(3,2),'ko'); 

    elseif pattern(i,n)==4 

         plot(pattern(i,1),pattern(i,2),'y*'); 

         plot(center(4,1),center(4,2),'ko'); 

    else 

         plot(pattern(i,1),pattern(i,2),'m*'); 

         plot(center(4,1),center(4,2),'ko'); 

    end 

end 

grid on;  

原始数据:

硬C均值聚类_第1张图片

分为四类:

硬C均值聚类_第2张图片

你可能感兴趣的:(算法)