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仿真代码:

    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

    仿真结果:


    进行三类划分:

    測试数据:

    结果:





    进行二类划分:

    測试数据


    结果:





    进行一类划分:

    測试数据:


    结果:


  • 相关阅读:
    口罩预约管理系统——系统网站实现(前端+PHP+MySQL)
    口罩预约管理系统——数据库设计(前端+PHP+MySQL)
    购书网站前端实现(HTML+CSS+JavaScript)
    HMM隐马尔可夫模型来龙去脉(二)
    Linux环境编程进程间通信机制理解
    Linux基本命令及编程环境实验
    大数据技术
    ModuleNotFoundError: No module named '_ctypes'的解决方案
    page-break-inside,page-break-before 分页
    C.char字符串的拼接和const char*的转换
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6865711.html
Copyright © 2011-2022 走看看