最大最小距离算法:
最大最小距离算法也成为小中取大距离算法。这种方法首先根据确定的距离阈值寻找聚类中心,然后根据最近邻规则把模式样本划分到各聚类中心对应的类别中。

问题的提出

已知N个待分类的模式样本{X1,X2,…,Xn},要求分别分类到聚类中心Z1,Z2,…对应的类别中。

算法描述

1.任选一个模式样本作为第一聚类中心Z1。

2.选择离Z1距离最远的模式样本作为第二类聚类中心Z2。

3.逐个计算每个模式样本与已知确定的所有聚类中心之间的距离,并选出其中的最小距离。

4.在所有最小距离中选出一个最大距离,如果该最大值达到||Z1-Z2||的一定分数比值以上,则将产生最大距离的那个模式样本定义为新增聚类中心,并返回上一步。否则,聚类中心的计算步骤结束。

5.重复步骤3和4,直到没有新的聚类中心出现为止。

6.寻找聚类中心的运算结束后,将模式样本{Xi;i=1,2,…,n}按最近距离划分到相应的聚类中心所代表的的类别中。

从上面的步骤可以看出,最大最小距离算法可以概括的描述为以“试探类间欧氏距离最大”作为预选出最初聚类中心的条件;根据最小距离中的最大距离情况,确定其余的聚类中心;将全部聚类中心确定完之后,再按最近距离将所有模式划分到各类中去。算法的关键是怎样开新类,以及新类中心如何确定。因为算法的核心是寻找最小距离中的最大距离,所以也称小中取大距离算法。

1.最大最小距离聚类算法(Matlab版本)
 

测试代码:test.m

clear all
 clc
 x=[0,0; 3,8; 2,2;1,1; 5,3; 4,8; 6,3; 5,4;  6,4;  7,5]
 Theta=0.5;
 [pattern,centerIndex]=MaxMinDisFun(x,0.5)
 %%%%%%%%%%%%%%%%%
 %函数名称 MaxMinDisFun(x,Theta)
 %输入参数:
 %           x  : x为n*m的特征样本矩阵,每行为一个样本,每列为样本的特征
 %         Theta:即θ,可用试探法取一固定分数,如:1/2
 %输出参数:
 %       pattern:输出聚类分析后的样本类别
 %   centerIndex:聚类中心点
 %函数功能 :利用最大最小距离算法聚类样本数据,
 %%%%%%%%%%%%%%%%%%%%%
 function [classes,centerIndex]=MaxMinDisFun(x,Theta)
 maxDistance=0;
 start=1;    %初始选一个中心点
 index=start;%相当于指针指示新中心点的位置
 k=1;        %中心点计数,也即是类别
 dataNum=size(x,1);  %输入的样本数
 centerIndex=zeros(dataNum,1); %保存中心点
 distance=zeros(dataNum,1);    %表示所有样本到当前聚类中心的距离
 minDistance=zeros(dataNum,1); %取较小距离
 classes=zeros(dataNum,1);     %表示类别
  
 centerIndex(1)=index;%保存第一个聚类中心
 classes(:)=k;        %初始类别全为k
 %%
 for i=1:dataNum
     distance(i)=sqrt((x(i,:)-x(centerIndex(1),:))*(x(i,:)-x(centerIndex(1),:))');%欧氏距离,与第1个聚类中心的距离
     classes(i)=k;%第1类
     if(maxDistance<distance(i))
         maxDistance=distance(i);%与第一个聚类中心的最大距离
         index=i;%与第一个聚类中心距离最大的样本
     end
 end
 %%
 minDistance=distance;
 % minDistance(index,1)=0;
 maxVal=maxDistance;
 while(maxVal>(maxDistance*Theta))%判断新的聚类中心是否满足条件
     k=k+1;
     centerIndex(k)=index;%判断新的聚类中心是否满足条件,若满足则新增聚类中心
     for i=1:dataNum 
             distance(i)=sqrt((x(i,:)-x(centerIndex(k),:))*(x(i,:)-x(centerIndex(k),:))');%与第k个聚类中心的距离
            if(minDistance(i)>distance(i))
                minDistance(i)=distance(i);
                classes(i)=k;%按照当前最近临方式分类,哪个近就分哪个类别
            end
     end
     %查找minDistance中最大值
     maxVal=0;
     for i=1:dataNum
         if((maxVal<minDistance(i))) 
             maxVal=minDistance(i);
             index=i;
         end
     end
 %     centerIndex(k+1)=index;%新的聚类中心
     aaa=0;
 end
 end  
 运行结果:x =
      0     0
      3     8
      2     2
      1     1
      5     3
      4     8
      6     3
      5     4
      6     4
      7     5
 pattern =
      1
      2
      1
      1
      3
      2
      3
      3
      3
      3
 centerIndex =
      1
      6
      7
      0
      0
      0
      0
      0
      0
      0