logo资料库

ISODATA算法.doc

第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
资料共12页,剩余部分请下载后查看
 算法: 第一步:输入 N 个模式样本{xi, i = 1, 2, …, N} 预选 Nc 个初始聚类中心 ,z,z{ 2 1  }z cN ,它可以不等于 所要求的聚类中心的数目,其初始位置可以从样本中任 意选取。 预选:K = 预期的聚类中心数目; θN = 每一聚类域中最少的样本数目,若少于此 数即不作为一个独立的聚类; θS = 一个聚类域中样本距离分布的标准差; θc = 两个聚类中心间的最小距离,若小于此数, 两个聚类需进行合并; L = 在一次迭代运算中可以合并的聚类中心的 最多对数; I = 迭代运算的次数。 第 二 步 : 将 N 个 模 式 样 本 分 给 最 近 的 聚 类 Sj , 假 若 D j  }N,2,1i,zxmin{ c   i ,即||x-zj||的距离最小, 则 jSx  。 第三步:如果 Sj 中的样本数目 Sj<θN,则取消该样本子集,此时 Nc 减去 1。 (以上各步对应基本步骤(1))
第四步:修正各聚类中心 z j 1 N   Sxj  j ,x ,2,1j  N, c 第五步:计算各聚类域 Sj 中模式样本与各聚类中心间的平均距离 D j   1 N j Sx  j ,zx j  ,2,1j  N, c 第六步:计算全部模式样本和其对应聚类中心的总平均距离 1D  N N  1j  jDN j (以上各步对应基本步骤(2)) 第七步:判别分裂、合并及迭代运算 1. 若迭代运算次数已达到 I 次,即最后一次迭代,则置θc =0, 转至第十一步。 2. 若 N c  ,即聚类中心的数目小于或等于规定值的一半,则 K 2 转至第八步,对已有聚类进行分裂处理。 3. 若迭代运算的次数是偶数次,或 N c  ,不进行分裂处理, K2 转 至 第 十 一 步 ; 否 则 ( 即 既 不 是 偶 数 次 迭 代 , 又 不 满 足 N c  ),转至第八步,进行分裂处理。 K2 (以上对应基本步骤(3))
第八步:计算每个聚类中样本距离的标准差向量  nj   j2 j1 ( , j , , T ) 其中向量的各个分量为  ij  1 N j jN  1k  x( ik  2 )z ij 式中, i = 1, 2, …, n 为样本特征向量的维数,j = 1, 2, …, Nc 为聚类数,Nj 为 Sj 中的样本个数。 第九步:求每一标准差向量{σj, j = 1, 2, …, Nc}中的最大分量,以 {σjmax, j = 1, 2, …, Nc}代表。 第十步:在任一最大分量集{σjmax, j = 1, 2, …, Nc}中,若有σjmax> θS ,同时又满足如下两个条件之一: 1. D j  和 Nj > 2(θN + 1),即 Sj 中样本总数超过规定 D 值一倍以上, 2. N c  K 2 则将 zj 分裂为两个新的聚类中心  jz 和   jz 中对应于σjmax 的分量加上 kσjmax,其中 jz ,且 Nc 加 1。 jz ;  1k  0 中对应于σjmax 的分量减去 kσjmax。 如果本步骤完成了分裂运算,则转至第二步,否则继续。 (以上对应基本步骤(4)进行分裂处理)
第十一步:计算全部聚类中心的距离 Dij = || zi - zj ||,i = 1, 2, …, Nc-1 ,j =i+1, …, Nc。 第十二步:比较 Dij 与θc 的值,将 Dij <θc 的值按最小距离次序 递增排列,即 ,D,D{ i j 22 ji 11 }D, j LL i  D 式中, D  第十三步:将距离为 kk j    D 。 ji 22 ji 11 iD 的两个聚类中心 kiz 和 kjz 合并,得新的 j LL i 中心为: z * k  1  N j k N i k zN[ i k  i k ]zN j k j k ,k = 1, 2, …, L 式中,被合并的两个聚类中心向量分别以其聚类域内 的样本数加权,使 * kz 为真正的平均向量。 (以上对应基本步骤(5)进行合并处理) 第十四步:如果是最后一次迭代运算(即第 I 次),则算法结束; 否则,若需要操作者改变输入参数,转至第一步;若 输入参数不变,转至第二步。 在本步运算中,迭代运算的次数每次应加 1。 [算法结束]
void CProcess::DHISODATA(unsigned char* dataN,int * imagelabel,int row,int col,int mC, int mKc, int mKn, double mKs, double mKd, int mL, int mI) { // // // // // int N; N=row*col; //将各像素点分配到相应的灰度级中 //int** ClusterLevel;//存储各类包含的灰度级 int GrayLevelNum[256]={0};//存储各灰度级的点个数 //int* ClusterLevelNum;//存储各类包含的灰度级数 ClusterLevel=new int*[20]; for (int i=0;i<20;i++) { ClusterLevel[i]=new int[256]; } for (int i=0;i=0;i--) { if (GrayLevelNum[i]) { maxGray=i; break; } }
// // // double c; c=(maxGray-minGray)*1.0/(mKc+1); for (int i=1;i
距离 int m_AverDist; m_AverDist=0;//存储总平均距离 for (int i=0;i
{ } int level; level=Cluster[i].at(j); levellabel[level]=i; } CString num; num.Format(_T("最终聚类数:%d"),mKc); AfxMessageBox(num); Cluster.clear(); for (int i=0;i
分享到:
收藏