近期上课学习了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_max
for i