#include<stdio.h>
#include<math.h>
#define K 3//聚类总数
#define k 0.5
#define min 1//每类最少的样本数目
#define deviations 1//聚类域内样本距离分布的标准差
#define mindistence 3//聚类中心的最小距离
#define I 4//迭代运算的次序号
#define N 10//样本数
#define n 2//样本维数
//计算每个聚类的样本数
void eachnumber(int number[],double x[N][n],int label[])
{
int i,j;
for(i=0;i<N;i++)
{
for(j=0;j<K;j++)
if(label[i]==j)
number[j]=number[j]+1;
}
}
//返回a和b的距离
double distenceh(double a[],double b[])
{
return (sqrt((a[0]-b[0])*(a[0]-b[0])+(a[1]-b[1])*(a[1]-b[1])));
}
//求向量的最大分量
double maxd(double a[])//n维
{
int i;
double b=a[0];
for(i=0;i<n;i++)
if(b<a[i])
b=a[i];
return b;
}
//主函数
void main()
{
int i,j,t,r;
double x[N][n]={{0,0},{3,8},{2,2},{1,1},{5,3},{4,8},{6,3},{5,4},{6,4},{7,5}};
int label[N]={0,0,0,0,0,0,0,0,0,0};//10个样本的标签
double z1[K][n]={{0,0},{0,0},{0,0}};//三个聚类的中心
double z2[K][n]={{0,0},{0,0},{0,0}};//三个备用聚类中心
double deviation[K][n]={{0,0},{0,0},{0,0}};//聚类中样本距离标准差向量
double deviationm[K]={0,0,0};//第K类标准差向量最大分量
for(i=0;i<N;i++)
for(j=0;j<n;j++)
z1[0][j]=z1[0][j]+x[i][j]/N;//初始聚类中心
int Nc=1;//聚类数初始值
int number[K]={10,0,0};//每个聚类的样本数
int number2[K]={0,0,0};//每个聚类的样本数
double distence[K]={0,0,0};//类内平均距离
double dis=0;//样本平均距离
for(i=0;i<I;i++)
{
eachnumber(number,x,label);//计算每个聚类的样本数
for(j=0;j<K;j++)//计算类内平均距离
if(number[j]!=0)
for(t=0;t<N;t++)
if(label[t]==j)
distence[j]=distence[j]+distenceh(z1[j],x[t])/number[j];//类内距离计算结束
for(j=0;j<K;j++)
dis=dis+number[j]*distence[j]/N;//样本平均距离
if(((i+1)==((i+1)/2)*2)||(Nc>=2*K))//合并处理
{
}
else//分裂处理
{
for(j=0;j<K-1;j++)//可能有bug
{
if(number[j]!=0)//第j类非空
{
for(t=0;t<n;t++)//计算其类内样本距离分布的标准差
{
for(r=0;r<N;r++)
if(label[r]==j)//第r个样本属于第j类
deviation[j][t]=deviation[j][t]+pow(x[r][t]-z1[j][t],2);
deviation[j][t]=sqrt(deviation[j][t]/number[j]);
}//类内样本距离分布的标准差计算完毕
deviationm[j]=maxd(deviation[j]);//最大分量
//printf("aa%f\n",deviationm[j]);
if(deviationm[j]>deviations&&(distence[j]>dis&&number[j]>2*(min+1)||Nc<=K/2))
{
Nc=Nc+1; //printf("aa\n");
for(t=0;t<n;t++)
{
if(deviation[j][t]==deviationm[j])
{
z2[j][t]=z2[j][t]+k*deviationm[j];
//printf("aa\n");
z2[j+1][t]=z2[j+1][t]-k*deviationm[j];
}
if(deviation[j][t]!=deviationm[j])
{
z2[j][t]=z2[j][t];
z2[j+1][t]=z2[j+1][t];
}
}//得到新的一分为二的聚类中心
for(t=0;t<N;t++)
if(label[t]==j)
{
if(distenceh(x[t],z2[j])>distenceh(x[t],z2[j+1]))
label[t]=j+1; //printf("aa\n");
else
label[t]=j; //printf("aa\n"); }
}
}//第j类分裂完毕
}
}
}
}
for(i=0;i<N;i++)
for(j=0;j<K;j++)
if(label[i]==j)
{
printf("第%d类有\n",j);
printf("x[%d]\n",i);
}
}
ISODATA.rar_Isodate算法_isodata_visual c_聚类系统
版权申诉
78 浏览量
2022-09-22
18:04:01
上传
评论
收藏 89KB RAR 举报
Kinonoyomeo
- 粉丝: 76
- 资源: 1万+
最新资源
- 前端-html+css+js实现爱心特效
- c40539bc-071a-486c-9d52-9d0c18d62dac 4.html
- 基于物理的非视域成像(NLOS)算法,利用了nerf+python源码+文档说明
- yuluer知更鸟.7z(1).001
- 基于Qt实现医院信息管理系统c++源码+文档说明+数据库(期末大作业)
- 基于python实现的医院信息管理系统完整源码+sql数据库+详细注释(高分课程设计)
- 基于python的眼底图像视杯视盘分割项目源码+文档说明+截图演示+详细注释(高分课程设计)
- ImageBasedModellingEdu-贰壹贰叁零
- DFFmeasurement-数据预处理
- ImageBasedModellingEdu-回文素数c语言
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈