zoukankan      html  css  js  c++  java
  • 基于最大最小距离的分类数目上限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仿真代码:

     1 clc;
     2 clear;
     3 %   load Data1.mat  %加载数据
     4  ClomStatic=[7,1,3,5,1,56,57,53,24,16,20,21];
     5 len=length(ClomStatic);%求向量ClomStatic的长度
     6 
     7 %如果存在非零长度,则至少为一类.
     8 if(len>0)
     9     k=1;
    10     Z(k)=ClomStatic(1);         %取第一个位置为第一个聚类中心
    11     TempZ=ClomStatic(len);
    12 
    13     %如果最大最小数值差值大于20,则至少存在两类
    14      if(TempZ-Z(1)>=5)
    15             k=k+1;
    16             Z(k)=ClomStatic(len);       %取第最后个位置为第二个聚类中心
    17 
    18 
    19         %逐个求出各个样本和聚类中心Z(1),Z(2)之间的距离选出每个点到聚类中心中的较小值
    20         D=zeros(len,2);
    21         M=zeros(1,len);
    22         for i=1:len
    23             D(i,1)=abs(ClomStatic(i)-Z(1));
    24             D(i,2)=abs(ClomStatic(i)-Z(2));
    25             M(i)=min(D(i,:));
    26         end
    27 
    28         %在M中找出最大值和20(20为聚类间隔,自定义设定),若大于,则产生新的聚类中心,否则无新的聚类中心,判断是否存在第三类
    29         [m indexm]=max(M);
    30             if(m>0.32*abs(Z(1)-Z(2)))
    31                 k=k+1;      %如果k<3则聚类结束
    32                 Z(k)=ClomStatic(indexm);
    33             end
    34 
    35         %若Z(3)存在
    36         if(k==3)
    37             %将样本按最近距离分到最近的聚类中心 k=3
    38             TempDistance=zeros(len,k);
    39             p1=1;
    40             p2=1;
    41             p3=1;
    42             for i=1:len
    43                 for j=1:k
    44                     TempDistance(i,j)=abs(ClomStatic(i)-Z(j));
    45                 end
    46                 [Dis GroupIndex]=min(TempDistance(i,:));
    47                 if(GroupIndex==1)%Group保存最终的分类结果
    48                      Group1(p1)=ClomStatic(i);
    49                      p1=p1+1;
    50                  elseif(GroupIndex==2)
    51                      Group2(p2)=ClomStatic(i);
    52                       p2=p2+1;
    53                  elseif(GroupIndex==3)
    54                      Group3(p3)=ClomStatic(i);
    55                      p3=p3+1;
    56                 end
    57             end
    58             %求类中心
    59             ClassCenter=zeros(1,3);
    60             ClassCenter(1)=floor(sum(Group1)/length(Group1));
    61             ClassCenter(2)=floor(sum(Group2)/length(Group2));
    62             ClassCenter(3)=floor(sum(Group3)/length(Group3));
    63        else
    64          %将样本按最近距离分到最近的聚类中心 k=2
    65         TempDistance=zeros(len,k);
    66         p1=1;
    67         p2=1;
    68         for i=1:len
    69             for j=1:k
    70                 TempDistance(i,j)=abs(ClomStatic(i)-Z(j));
    71             end
    72             [Dis GroupIndex]=min(TempDistance(i,:));
    73             if(GroupIndex==1)                       %Group保存最终的分类结果
    74                  Group1(p1)=ClomStatic(i);
    75                 p1=p1+1;
    76              elseif(GroupIndex==2)
    77                  Group2(p2)=ClomStatic(i);
    78                 p2=p2+1;
    79             end
    80         end
    81         %求类中心
    82         ClassCenter=zeros(1,2);
    83                
    84         ClassCenter(1)=floor(sum(Group1)/length(Group1));
    85         ClassCenter(2)=floor(sum(Group2)/length(Group2));
    86      end
    87 else
    88        %k=1;
    89          j=1;
    90         for i=1:len
    91             Group1(j)=ClomStatic(i);
    92             j=j+1;
    93         end
    94        %求类中心
    95         ClassCenter=zeros(1,1);
    96                
    97         ClassCenter(1)=floor(sum(Group1)/length(Group1));
    98      end
    99 end

    仿真结果:

    进行三类划分:

    测试数据:

    结果:



    进行二类划分:

    测试数据


    结果:



    进行一类划分:

    测试数据:


    结果:

  • 相关阅读:
    hdu 1042 N!
    hdu 1002 A + B Problem II
    c++大数模板
    hdu 1004 Let the Balloon Rise
    hdu 4027 Can you answer these queries?
    poj 2823 Sliding Window
    hdu 3074 Multiply game
    hdu 1394 Minimum Inversion Number
    hdu 5199 Gunner
    九度oj 1521 二叉树的镜像
  • 原文地址:https://www.cnblogs.com/vpoet/p/4659737.html
Copyright © 2011-2022 走看看