近期上课学习了isodata的迭代自组织数据分析算法,该算法是一个动态的聚类算法,与K-均值算法有相似之处,即聚类中心同样是通过样本均值的迭代运算来决定的,但不同k-均值算法的是,isodata算法是可以通过计算的中间过程,对聚类中心的数量进行调整。对一个算法,要想真正的了解,是能够在学习完该算法的基础上,能够自主地编写,在编写过程中你会发现在学习过程中的很多不足。因此,尽管网上已经有了成熟的isodata算法程序,楼主还是不才,自己编写程序进行该算法的学习。该算法主要参照了蔡元龙老师的《模式识别》一书,程序是用matlab编写。该算法写的比较急,必然会出现一些不足,请大家能够多多指出,共同进步。

首先,是对一系列参数的初始化,能力有限,所以在代码中pars.L中的参数必须是1,即一次迭代运算中可以合并的聚类中心的最多对数最多是1,这一点会及时更新。

%programed by Lu Qi,my email:qqlu1992@gmail.com
clear all
clc
% train_x=[0 0;0 1;1 0;1 1;7 7;8 8;9 9;8 7;8 9];load data_train
%参数的初始化
%step one
[pars.num_train,pars.length]=size(train_x);%num_train代表样本的数量,length代表样本的维数
pars.num_initial_cluster=5;
pars.num_cluster=pars.num_initial_cluster;
initial=randperm(pars.num_train);
pars.iter_max=20;
initial_point=initial(1:pars.num_initial_cluster);
pars.z{1}=train_x(initial_point,:); %第一次初始聚类中心
clear initial initial_point
pars.K=5;
pars.k=1;   %k代表分裂处理时的加减
pars.sita_N=3;   %每一聚类域中最少的样本数目,如少于此数就不作为一个独立的聚类
pars.sita_S=1;   %聚类域中样本距离分布的标准差
pars.sita_C=1;   %两聚类中心之间的最小距离,如小于此数,两个聚类进行合并
pars.L=1;        %一次迭代运算中可以合并的聚类中心的最多对数
pars.iter=1;

接着,是通过上一次的聚类中心进行归类并更新各聚类中心值及类内和类间的平均距离。

for iter=1:pars.iter_maxfor i=1:pars.num_train %计算到聚类中心的分类,样本的数量for j=1:pars.num_clusterd(i,j)=norm(train_x(i,:)-pars.z{iter}(j,:));end   end[min_d,index]=min(d,[],2);clear min_dclear pars.g
%      pars.g(1:pars.num_cluster,1)=0;for i=1:pars.num_trainfor j=1:pars.num_clusterif (index(i))==jpars.g(j,i)=[;i];    %离每一个聚类最近的样本点elsepars.g(j,i)=0;endendend
%      pars.g(1:pars.num_cluster,1)=[];
%      for j=1:pars.num_cluster
%         if ~exsit('pars.g(j,:),)
%             pars.g(j,1:num_train)=0;
%         end
%      end%step threefor j=1:pars.num_clusterN(j)=sum(pars.g(j,:)~=0,2); %求每个聚类中的样本数目endfor j=1:pars.num_clusterif N(j)<pars.sita_Ndelete_clusters=[;j];    %删除该行endendif exist('delete_clusters')if delete_clusters~=0pars.g(delete_clusters,:)=[];endclear delete_clustersendpars.num_cluster=size(pars.g,1);   %删除后的聚类数量%step four%x修正各聚类中心值temp_sum_d=0;for j=1:pars.num_clustertemp=find(pars.g(j,:));        %找每一类中不等于0的数pars.z{iter+1}(j,:)=sum(train_x(temp,:))/(length(temp));q_max=length(temp);temp_d=0;for q=1:q_maxtemp_d=temp_d+norm(train_x(temp(q),:)-pars.z{iter+1}(j,:));end%step five,计算各聚类域中诸聚类中心间的平均距离pars.aver_d{iter+1}(j)=temp_d/(q_max);  temp_sum_d=temp_sum_d+temp_d;end%step sixpars.aver_sum_d{iter+1}=temp_sum_d/pars.num_train;clear temp_d temp_sum_d q_max qpars.iter=iter;%进行分裂合并的处理工作[pars]=settle_split_merge(train_x,pars);clear pars.gfprintf('iter=%d\n',iter);
end

在该程序中,有很多编程的小细节要注意,写完程序之后调了好长时间的BUG。在程序中,有一个分程序是,分裂合并处理 [pars]=settle_split_merge(train_x,pars),该程序如下:

function [pars]=settle_split_merge(train_x,pars)
% clear all
% clc
% load temporary
% pars.k=0.5;
% 进行合并或者分裂的处理
while 1if ~((pars.iter==pars.iter_max)||(rem(pars.iter,2)==0)||(size(pars.g,1)>=2*pars.K)) %跳到第8步%step 8,计算每聚类中样本距离的标准差向量for j=1:pars.num_clusterfor i=1:pars.length              %维数temp=find(pars.g(j,:));        %找每一类中不等于0的数temp_length=length(temp);for q=1:temp_lengthd(q,i)=(train_x(temp(q),i)-pars.z{end}(j,i))^2; %某个样本的某一维到聚类中心的某一维的距离ends(i,j)=sqrt(sum(d(q,:))/temp_length);  %横坐标代表维数,纵坐标代表聚类数endend%step 9[s_jmax,index]=max(s,[],1);%step 10temp=length(s_jmax);  %聚类数tt=0;      %用于跳转的标识符for j=1:tempif s_jmax(j)>pars.sita_Sif ((pars.aver_d{pars.iter+1}(j)>pars.aver_sum_d{pars.iter+1})&&(length(find(pars.g(j,:)))>(2*(pars.sita_N+1))))||(temp<=(pars.K/2))a=zeros(pars.length);dimension=index(j);a(dimension,dimension)=1;pars.z{pars.iter+1}(size(pars.z{pars.iter+1},1)+1,:)=pars.z{pars.iter+1}(j,:)+(pars.k*a*s(:,j))';pars.z{pars.iter+1}(j,:)=pars.z{pars.iter+1}(j,:)-(pars.k*a*s(:,j))';tt=1;pars.num_cluster=pars.num_cluster+1;clear a dimensionbreak;   %跳转到第二步!!!要进行修改endendendif tt==1break;endend% 第11步,合并处理if pars.iter==pars.iter_max   %最后一次迭代判断par.sita_C=0;endtemp=length(pars.z{pars.iter+1});for i=1:tempfor j=1:id_merge(i,j)=norm(pars.z{pars.iter+1}(i,:)-pars.z{pars.iter+1}(j,:));endendpp=max(d_merge(:));for i=1:size(d_merge,1)for j=i:size(d_merge,1)d_merge(i,j)=pp+1;endendclear pp[xsort,index]=sort(d_merge(:));if xsort(1)<pars.sita_Cfor i=1:pars.Lif xsort(i)<pars.sita_C[pp_raw,pp_col]=ind2sub(size(d_merge),index(i));pars.z{pars.iter+1}(min(pp_raw,pp_col),:)=(length(find(pars.g(min(pp_raw,pp_col)))~=0)*pars.z{pars.iter+1}(min(pp_raw,pp_col),:) ...+length(find(pars.g(max(pp_raw,pp_col)))~=0)*pars.z{pars.iter+1}(max(pp_raw,pp_col),:)) .../(length(find(pars.g(min(pp_raw,pp_col)))~=0)+length(find(pars.g(max(pp_raw,pp_col))))~=0);pars.z{pars.iter+1}(max(pp_raw,pp_col),:)=[];pars.num_cluster=pars.num_cluster-1;
%             temp=find(pars.g(j,:));        %找每一类中不等于0的数
%             temp_length=length(temp);endendendbreak;
end

通过这两个程序就可以运行出来结果了,例如我一共做了5类的样本,最终结果如下:

 the 1th cluster center is 5.5000  5.5000 
 the 2th cluster center is 5.5000 -5.5000 
 the 3th cluster center is 0.5000  0.5000 
 the 4th cluster center is-5.5000 -5.5000 
 the 5th cluster center is-5.5000  5.5000

由于在参数初始化中,初始的聚类中心是随机选的,所以最终的聚类结果和初始聚类中心影响比较大,有时我的会出现四类,而忽略了最后一类,甚至有时会出现三类,如图:

the 1th cluster center is 5.5000 -5.5000 
the 2th cluster center is 5.5000  5.5000 
the 3th cluster center is-5.5000 -5.5000

the 4th cluster center is-5.5000  5.5000

个人感觉isodata算法比较适合高维的样本,如果是比较简单的样本聚类,效果甚至不如K-means。

如果有什么不足,请大家联系我:qqlu1992@gmail.com

聚类之isodata算法相关推荐

  1. 5 模式识别-动态聚类算法(K均值算法、迭代自组织的数据分析ISOData算法)

    武汉理工大学资源 郭志强 动态聚类算法:先选取初始的中心(每个类别的初始中心),然后把所有的样本进行聚类分析,聚类完成后,就去判断这个聚类结果合不合理(满不满足设计指标要求),如果合理就输出聚类结果( ...

  2. c语言iso校验算法,模式识别c语言ISODATA算法.doc

    模式识别c语言ISODATA算法.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. ...

  3. C#,图像二值化(17)——全局阈值的ISODATA算法(亦称作InterMeans法)及其源程序

    二值算法综述请阅读: C#,图像二值化(01)--二值化算法综述与二十三种算法目录https://blog.csdn.net/beijinghorn/article/details/128425225 ...

  4. 模式识别c语言isodata算法,《模式识别-黄庆明》第二章(ISODATA算法实例).doc

    ISODATA算法实例: 此例中N 8,n 2.假设取初始值Nc 1,z1 1 x1 0 0 T,则运算步骤如下: 第一步:取K 2,θN 1,θS 1,θc 4,L 1,I 4 预选:K 预期的聚类 ...

  5. k-means聚类的传统算法和优化

    参考文章:https://www.cnblogs.com/yixuan-xu/p/6272208.html   一.概述 在本篇文章中将对四种聚类算法(K-means,K-means++,ISODAT ...

  6. 聚类和EM算法——K均值聚类

    20211116 数据分析 | 聚类分析--kmean kmeans最优k值的确定方法-手肘法和轮廓系数法 - 简书 python大战机器学习--聚类和EM算法 注:本文中涉及到的公式一律省略(公式不 ...

  7. 层次聚类定义、层次聚类过程可视化、簇间距离度量、BIRCH、两步聚类、BIRCH算法优缺点

    层次聚类定义.层次聚类过程可视化.簇间距离度量.BIRCH.两步聚类.BIRCH算法优缺点 目录

  8. 图像降噪算法——低秩聚类:WNNM算法

    图像降噪算法--低秩聚类:WNNM算法 图像降噪算法--低秩聚类:WNNM算法 1. 基本原理 2. matlab代码 3. 结论 图像降噪算法--低秩聚类:WNNM算法 同样是为了完善自己知识版图的 ...

  9. 统计学习方法第十四章作业:聚类—层次聚类聚合/分裂算法、K_means聚类算法 代码实现

    层次聚类聚合/分裂算法 import numpy as np import copy import matplotlib.pyplot as pltclass Hierarchical_cluster ...

最新文章

  1. js 判断是否为null
  2. swoole 定时器
  3. Fiddler使用教程(收藏)
  4. ubuntu 下 opencv 3. 的安装和运行
  5. java 内部类和静态内部类的区别
  6. SD卡、TF卡坏道及容量检测
  7. 铁道部网站扩容投诉与建议
  8. 雨林木风诚聘Linux研发工程师
  9. Robot framework模拟打开浏览器问题
  10. 如何在Win7中安装使用超级终端Hyper Terminal
  11. java读取excel大文件
  12. 美国宣布成立人工智能特别委员会,要确保继续处于领先
  13. pentile 子像素_三星和索尼OLED子像素排列方式对比 有哪些差异?
  14. Phenix图文流程:使用docking解决Cryo-EM数据的结构问题
  15. 计算机中cmos设置程序,计算机CMOS设置详解.doc
  16. 资料员培训建筑八大员培训建筑资料员工程建筑资料与施工管理
  17. 全面解读IDC经营许可证
  18. 8051 ,80C51 ,MCS-51这三者的区别
  19. 天路(01规划+SPFA判负环)
  20. 获取iWatch的UDID

热门文章

  1. 探讨如何成为技术团队管理者
  2. 阿里P8高级架构师:面试没你想象中的难,拿Offer也可以很轻松
  3. 在使用chrome调试angular2的时候出现下面问题
  4. 【CentOS7-Python系列】之一【VMwareWorkstation安装CentOS7】
  5. Linux获取毫秒级时间
  6. 虚机如果要访问SAN中的多个LUN,如何实现高可用
  7. Hive学习笔记 —— Hive的管理
  8. 如何隐藏system函数的窗口
  9. 【Python-ML】神经网络-Theano张量库(GPU版的Numpy)
  10. TensorFlow example示例 Process finished with exit code -1073741819 (0xC0000005)