首页 > 代码库 > 基于最大最小距离的分类数目上限K确定的聚类方法

基于最大最小距离的分类数目上限K确定的聚类方法

聚类是数据挖掘非常重要的组成部分.

而大多数聚类算法都须要事先确定分类数目K.

而本文是在实际情况下确定分类数目K的上限.进而对数据样本进行自己主动分类.


首先介绍下最大最小距离算法:

设样本集为X{x(1),x(2).......}

1.选取随意一个样本作为第一个聚类中心 如z(1)=x(1)

2.选取距离z(1)最远的样本点作为第二个聚类中心,设为z(2)

3.计算每一个样本到z(1),z(2)的距离D(i,1),D(i,2);并选出当中最小的距离T(i)=min(D(i,1),D(i,2))

4.在全部样本最小值中选择最大值即max(T);

5.若max(T(i))>=θ|z(1)-z(2)|,(θ为事先给定,|z(1)-z(2)|为两聚类中心的距离),则z(3)=x(i),否则无新的聚类中心.则找聚类中心结束,θ可用试探法,仅仅要能将想要的类别识别就可以.这里设z(3)=x(7)

6.若z(3)存在,则继续步骤3,计算每一个样本到z(1),z(2),z(3)的距离D(i,1),D(i,2),D(i,3);并选出当中最小的距离T(i)=min(D(i,1),D(i,2),D(i,3))

7.反复步骤4,5直到不满足5的条件,聚类结束.

8.如果一共仅仅要三个聚类中心.那么比較每一个样本点到三个聚类中心的距离.距离最小者即符合该类,属于该类.



改近的最大最小距离算法:

设样本集为X{x(1),x(2)........},此样本集最多分为3类,即k=1或k=2或k=3

1.首先将样本集合的数据进行升序排序Y(y(1),y(2).......y(N))

2.假设样本集至少存在一个数据,则说明至少存在一类.取排序后的第一个数为第一个聚类中心z(1)=y(1);避免了随机选取带来的不稳定性

3.假设排序后的样本集合最后一个元素的值减去第一个元素值>5 即觉得存在两类,这里取最后一个元素为第二个聚类中心.z(2)=y(N)

这也符合前两个聚类中心距离最远的条件.

4.再依据最大最小距离判定法则对剩下的聚类中心进行判定.





下面为matlab仿真代码:

clc;
clear;
%   load Data1.mat  %载入数据
 ClomStatic=[7,1,3,5,1,56,57,53,24,16,20,21];
len=length(ClomStatic);%求向量ClomStatic的长度

%假设存在非零长度,则至少为一类.
if(len>0)
    k=1;
    Z(k)=ClomStatic(1);         %取第一个位置为第一个聚类中心
    TempZ=ClomStatic(len);

    %假设最大最小数值差值大于20,则至少存在两类
     if(TempZ-Z(1)>=5)
            k=k+1;
            Z(k)=ClomStatic(len);       %取第最后个位置为第二个聚类中心


        %逐个求出各个样本和聚类中心Z(1),Z(2)之间的距离选出每一个点到聚类中心中的较小值
        D=zeros(len,2);
        M=zeros(1,len);
        for i=1:len
            D(i,1)=abs(ClomStatic(i)-Z(1));
            D(i,2)=abs(ClomStatic(i)-Z(2));
            M(i)=min(D(i,:));
        end

        %在M中找出最大值和20(20为聚类间隔,自己定义设定),若大于,则产生新的聚类中心,否则无新的聚类中心,推断是否存在第三类
        [m indexm]=max(M);
            if(m>0.32*abs(Z(1)-Z(2)))
                k=k+1;      %假设k<3则聚类结束
                Z(k)=ClomStatic(indexm);
            end

        %若Z(3)存在
        if(k==3)
            %将样本按近期距离分到近期的聚类中心 k=3
            TempDistance=zeros(len,k);
            p1=1;
            p2=1;
            p3=1;
            for i=1:len
                for j=1:k
                    TempDistance(i,j)=abs(ClomStatic(i)-Z(j));
                end
                [Dis GroupIndex]=min(TempDistance(i,:));
                if(GroupIndex==1)%Group保存终于的分类结果
                     Group1(p1)=ClomStatic(i);
                     p1=p1+1;
                 elseif(GroupIndex==2)
                     Group2(p2)=ClomStatic(i);
                      p2=p2+1;
                 elseif(GroupIndex==3)
                     Group3(p3)=ClomStatic(i);
                     p3=p3+1;
                end
            end
            %求类中心
            ClassCenter=zeros(1,3);
            ClassCenter(1)=floor(sum(Group1)/length(Group1));
            ClassCenter(2)=floor(sum(Group2)/length(Group2));
            ClassCenter(3)=floor(sum(Group3)/length(Group3));
       else
         %将样本按近期距离分到近期的聚类中心 k=2
        TempDistance=zeros(len,k);
        p1=1;
        p2=1;
        for i=1:len
            for j=1:k
                TempDistance(i,j)=abs(ClomStatic(i)-Z(j));
            end
            [Dis GroupIndex]=min(TempDistance(i,:));
            if(GroupIndex==1)                       %Group保存终于的分类结果
                 Group1(p1)=ClomStatic(i);
                p1=p1+1;
             elseif(GroupIndex==2)
                 Group2(p2)=ClomStatic(i);
                p2=p2+1;
            end
        end
        %求类中心
        ClassCenter=zeros(1,2);
               
        ClassCenter(1)=floor(sum(Group1)/length(Group1));
        ClassCenter(2)=floor(sum(Group2)/length(Group2));
     end
else
       %k=1;
         j=1;
        for i=1:len
            Group1(j)=ClomStatic(i);
            j=j+1;
        end
       %求类中心
        ClassCenter=zeros(1,1);
               
        ClassCenter(1)=floor(sum(Group1)/length(Group1));
     end
end

仿真结果:


进行三类划分:

測试数据:

技术分享

结果:

技术分享




进行二类划分:

測试数据

技术分享

结果:

技术分享




进行一类划分:

測试数据:

技术分享

结果:

技术分享

基于最大最小距离的分类数目上限K确定的聚类方法