博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于最大最小距离的分类数目上限K确定的聚类方法
阅读量:5918 次
发布时间:2019-06-19

本文共 4005 字,大约阅读时间需要 13 分钟。

聚类是数据挖掘很重要的组成部分.而大多数聚类算法都需要事先确定分类数目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:len23             D(i,1)=abs(ClomStatic(i)-Z(1));24             D(i,2)=abs(ClomStatic(i)-Z(2));25             M(i)=min(D(i,:));26         end27 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             end34 35         %若Z(3)存在36         if(k==3)37             %将样本按最近距离分到最近的聚类中心 k=338             TempDistance=zeros(len,k);39             p1=1;40             p2=1;41             p3=1;42             for i=1:len43                 for j=1:k44                     TempDistance(i,j)=abs(ClomStatic(i)-Z(j));45                 end46                 [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                 end57             end58             %求类中心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        else64          %将样本按最近距离分到最近的聚类中心 k=265         TempDistance=zeros(len,k);66         p1=1;67         p2=1;68         for i=1:len69             for j=1:k70                 TempDistance(i,j)=abs(ClomStatic(i)-Z(j));71             end72             [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             end80         end81         %求类中心82         ClassCenter=zeros(1,2);83                84         ClassCenter(1)=floor(sum(Group1)/length(Group1));85         ClassCenter(2)=floor(sum(Group2)/length(Group2));86      end87 else88        %k=1;89          j=1;90         for i=1:len91             Group1(j)=ClomStatic(i);92             j=j+1;93         end94        %求类中心95         ClassCenter=zeros(1,1);96                97         ClassCenter(1)=floor(sum(Group1)/length(Group1));98      end99 end

 

仿真结果:

进行三类划分:

测试数据:

结果:

 

进行二类划分:

测试数据

结果:

 

进行一类划分:

测试数据:

结果:

转载于:https://www.cnblogs.com/vpoet/p/4659737.html

你可能感兴趣的文章
VuGen:一般选项General Option
查看>>
ui-router---$stateProvider
查看>>
激励远程员工的5个高招
查看>>
Excel2007条件格式怎么用
查看>>
SVNclient安装与使用
查看>>
二维码图片生成(扩展知识:创建带圆角效果的图片)
查看>>
img超出div width时, jQuery动态改变图片显示大小
查看>>
浏览器的标准模式和怪异模式
查看>>
vim下使用YouCompleteMe实现代码提示、补全以及跳转设置
查看>>
高性能优化Web前端
查看>>
Google研究员Ilya Sutskever:成功训练LDNN的13点建议
查看>>
[控件] LineAnimationView
查看>>
Java中View游戏开发框架
查看>>
Unity3D之空间转换学习笔记(二):基础数学
查看>>
【转】Java并发编程:volatile关键字解析
查看>>
转对象(含length属性)成数组Array.prototype.slice.call(arguments)
查看>>
Android 4.4堆叠结构的变化
查看>>
WebApiThrottle限流框架
查看>>
Codeforces Gym 100513M M. Variable Shadowing 暴力
查看>>
Hacked VisualSVN Server by PHP to allow user change password
查看>>