算法:
第一步:输入 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