#include<stdio.h>
#include<math.h>
typedef struct sample
{
float x;
float y;
float z;
float p;
} SAMPLE;
float distance(SAMPLE a,SAMPLE b)
{
float d;
float a1=a.x, a2=a.y,a3=a.z,a4=a.p;
float b1=b.x, b2=b.y,b3=a.z,b4=b.p;
d=sqrt((a1-b1)*(a1-b1)+(a2-b2)*(a2-b2)+(a3-b3)*(a3-b3)+(a4-b4)*(a4-b4));
return d;
}
int MIN(float D[],int n)
{
int i;
int p=0;
float fmin=D[0];
for(i=1;i<n;i++)
{
if(D[i]<fmin) { fmin=D[i], p=i; }
}
return p;
}
int main()
{
SAMPLE point[150]={(5.1,3.5,1.4,0.2),
(4.9,3.0,1.4,0.2),
(4.7,3.2,1.3,0.2),
(4.6,3.1,1.5,0.2),
(5.0,3.6,1.4,0.2),
(5.4,3.9,1.7,0.4),
(4.6,3.4,1.4,0.3),
(5.0,3.4,1.5,0.2),
(4.4,2.9,1.4,0.2),
(4.9,3.1,1.5,0.1),
(5.4,3.7,1.5,0.2),
(4.8,3.4,1.6,0.2),
(4.8,3.0,1.4,0.1),
(4.3,3.0,1.1,0.1),
(5.8,4.0,1.2,0.2),
(5.7,4.4,1.5,0.4),
(5.4,3.9,1.3,0.4),
(5.1,3.5,1.4,0.3),
(5.7,3.8,1.7,0.3),
(5.1,3.8,1.5,0.3),
(5.4,3.4,1.7,0.2),
(5.1,3.7,1.5,0.4),
(4.6,3.6,1.0,0.2),
(5.1,3.3,1.7,0.5),
(4.8,3.4,1.9,0.2),
(5.0,3.0,1.6,0.2),
(5.0,3.4,1.6,0.4),
(5.2,3.5,1.5,0.2),
(5.2,3.4,1.4,0.2),
(4.7,3.2,1.6,0.2),
(4.8,3.1,1.6,0.2),
(5.4,3.4,1.5,0.4),
(5.2,4.1,1.5,0.1),
(5.5,4.2,1.4,0.2),
(4.9,3.1,1.5,0.1),
(5.0,3.2,1.2,0.2),
(5.5,3.5,1.3,0.2),
(4.9,3.1,1.5,0.1),
(4.4,3.0,1.3,0.2),
(5.1,3.4,1.5,0.2),
(5.0,3.5,1.3,0.3),
(4.5,2.3,1.3,0.3),
(4.4,3.2,1.3,0.2),
(5.0,3.5,1.6,0.6),
(5.1,3.8,1.9,0.4),
(4.8,3.0,1.4,0.3),
(5.1,3.8,1.6,0.2),
(4.6,3.2,1.4,0.2),
(5.3,3.7,1.5,0.2),
(5.0,3.3,1.4,0.2),
(7.0,3.2,4.7,1.4),
(6.4,3.2,4.5,1.5),
(6.9,3.1,4.9,1.5),
(5.5,2.3,4.0,1.3),
(6.5,2.8,4.6,1.5),
(5.7,2.8,4.5,1.3),
(6.3,3.3,4.7,1.6),
(4.9,2.4,3.3,1.0),
(6.6,2.9,4.6,1.3),
(5.2,2.7,3.9,1.4),
(5.0,2.0,3.5,1.0),
(5.9,3.0,4.2,1.5),
(6.0,2.2,4.0,1.0),
(6.1,2.9,4.7,1.4),
(5.6,2.9,3.6,1.3),
(6.7,3.1,4.4,1.4),
(5.6,3.0,4.5,1.5),
(5.8,2.7,4.1,1.0),
(6.2,2.2,4.5,1.5),
(5.6,2.5,3.9,1.1),
(5.9,3.2,4.8,1.8),
(6.1,2.8,4.0,1.3),
(6.3,2.5,4.9,1.5),
(6.1,2.8,4.7,1.2),
(6.4,2.9,4.3,1.3),
(6.6,3.0,4.4,1.4),
(6.8,2.8,4.8,1.4),
(6.7,3.0,5.0,1.7),
(6.0,2.9,4.5,1.5),
(5.7,2.6,3.5,1.0),
(5.5,2.4,3.8,1.1),
(5.5,2.4,3.7,1.0),
(5.8,2.7,3.9,1.2),
(6.0,2.7,5.1,1.6),
(5.4,3.0,4.5,1.5),
(6.0,3.4,4.5,1.6),
(6.7,3.1,4.7,1.5),
(6.3,2.3,4.4,1.3),
(5.6,3.0,4.1,1.3),
(5.5,2.5,4.0,1.3),
(5.5,2.6,4.4,1.2),
(6.1,3.0,4.6,1.4),
(5.8,2.6,4.0,1.2),
(5.0,2.3,3.3,1.0),
(5.6,2.7,4.2,1.3),
(5.7,3.0,4.2,1.2),
(5.7,2.9,4.2,1.3),
(6.2,2.9,4.3,1.3),
(5.1,2.5,3.0,1.1),
(5.7,2.8,4.1,1.3),
(6.3,3.3,6.0,2.5),
(5.8,2.7,5.1,1.9),
(7.1,3.0,5.9,2.1),
(6.3,2.9,5.6,1.8),
(6.5,3.0,5.8,2.2),
(7.6,3.0,6.6,2.1),
(4.9,2.5,4.5,1.7),
(7.3,2.9,6.3,1.8),
(6.7,2.5,5.8,1.8),
(7.2,3.6,6.1,2.5),
(6.5,3.2,5.1,2.0),
(6.4,2.7,5.3,1.9),
(6.8,3.0,5.5,2.1),
(5.7,2.5,5.0,2.0),
(5.8,2.8,5.1,2.4),
(6.4,3.2,5.3,2.3),
(6.5,3.0,5.5,1.8),
(7.7,3.8,6.7,2.2),
(7.7,2.6,6.9,2.3),
(6.0,2.2,5.0,1.5),
(6.9,3.2,5.7,2.3),
(5.6,2.8,4.9,2.0),
(7.7,2.8,6.7,2.0),
(6.3,2.7,4.9,1.8),
(6.7,3.3,5.7,2.1),
(7.2,3.2,6.0,1.8),
(6.2,2.8,4.8,1.8),
(6.1,3.0,4.9,1.8),
(6.4,2.8,5.6,2.1),
(7.2,3.0,5.8,1.6),
(7.4,2.8,6.1,1.9),
(7.9,3.8,6.4,2.0),
(6.4,2.8,5.6,2.2),
(6.3,2.8,5.1,1.5),
(6.1,2.6,5.6,1.4),
(7.7,3.0,6.1,2.3),
(6.3,3.4,5.6,2.4),
(6.4,3.1,5.5,1.8),
(6.0,3.0,4.8,1.8),
(6.9,3.1,5.4,2.1),
(6.7,3.1,5.6,2.4),
(6.9,3.1,5.1,2.3),
(5.8,2.7,5.1,1.9),
(6.8,3.2,5.9,2.3),
(6.7,3.3,5.7,2.5),
(6.7,3.0,5.2,2.3),
(6.3,2.5,5.0,1.9),
(6.5,3.0,5.2,2.0),
(6.2,3.4,5.4,2.3),
(5.9,3.0,5.1,1.8)}; //模式样本
SAMPLE center[3]; //聚类中心
SAMPLE sd[3];//standard deviation标准差向量
float sdm[3];//标准差向量中的最大分量(特征)
int flag[150];//每个样本所属类别
int count[3];//各类别样本数
float D[3]; //样本到每个聚类中心的距离
float Da[3]; //各聚类域中诸样本与聚类中心间的平均距离
float Dl; //全部模式样本对其相应聚类中心的总平均距离
float Dc[3]; //全部聚类中心的距离
float a=0.5;//系数
int t,t1,t2;
int i,j;
int n=0; //迭代次数
int K=3,Nl=1,S=1,C=4,L=1,I=6; //预设参数
int N=150;
int Nc=1;//分类次数
center[0]=point[0];
for(i=1;i<3;i++)
{
center[i].x=-1;
center[i].y=-1;
center[i].z=-1;
center[i].p=-1;
}
while(1)
{
n++;
//按近邻原则聚类
for(i=0;i<N;i++)
{
for(j=0;j<Nc;j++)
D[j]=distance(point[i],center[j]);
flag[i]=MIN(D,Nc);//注意
}
//赋初值
for(j=0;j<Nc;j++)
{
count[j]=0;
center[j].x=0;
center[j].y=0;
center[j].z=0;
center[j].p=0;
Da[j]=0;
Dl=0;
}
//修正聚类中心
for(i=0;i<N;i++)
{
j=flag[i];
center[j].x=center[j].x+point[i].x;
center[j].y=center[j].y+point[i].y;
center[j].z=center[j].z+point[i].z;
center[j].p=center[j].p+point[i].p;
count[j]++;
}
for(j=0;j<Nc;j++)
{
center[j].x=center[j].x/count[j];
center[j].y=center[j].y/count[j];
center[j].z=center[j].z/count[j];
center[j].p=center[j].p/count[j];
}
//计算各聚类域中诸样本与聚类中心间的平均距离
//和全部模式样本对其相应聚类中心的总平均距离
for(i=0;i<N;i++)
{
j=flag[i];
Da[j]+=distance(point[i],center[j]);
}
for(j=0;j<Nc;j++)
{
Dl+=Da[j];
Da[j]=Da[j]/count[j];
}
Dl=Dl/N;
//进行分裂处理
if(n!=I&&(Nc<=K/2||(Nc>K/2&&((fmod(n,2)!=0)&&Nc<2*K))))
{
for(j=0;j<Nc;j++)
{
sd[j].x=0;
sd[j].y=0;
sd[j].z=0;
sd[j].p=0;
}
for(i=0;i<N;i++)
{
j=flag[i]),
sd[j].x+=(point[i].x-center[j].x)*(point[i].x-center[j].x);
sd[j].y+=(point[i].y-center[j].y)*(point[i].y-center[j].y);
sd[j].z+=(point[i].z-center[j].z)*(point[i].z-center[j].z);
sd[j].p+=(point[i].p-center[j].p)*(point[i].p-center[j].p);
}
t=Nc;
for(j=0;j<t;j++)
{ float u;
sd[j].x=sqrt(sd[j].x/count[j]);
sd[j].y=sqrt(sd[j].y/count[j]);
sd[j].z=sqrt(sd[j].z/count[j]);
sd[j].p=sqrt(sd[j].p/count[j]);
if(sd[j].x>=sd[j].y)
u=sa[j].x;
else
u=sa[j].y;
if(u<sd[j].z)
u=sa[j].z;
if(u<sd[j].p)
u=sd[j].p;
if(u==sd[j].x)
{
sdm[j]=sd[j].x;
if(sdm[j]>S&&((Da[j]>Dl&&count[j]>2*(Nl+1))||Nc<=K/2))
{
center[Nc].x=center[j].x-a*sdm[j];
center[Nc].y=center[j].y;
center[Nc].z=center[j].z;
center[Nc].p=center[j].p;
center[j].x=center[j].x+a*sdm[j];
Nc++;
}
}
if(u==sd[j].y)
{
sdm[j]=sd[j].y;
if(sdm[j]>S&&((Da[j]>Dl&&count[j]>2*(Nl+1))||Nc<=K/2))
{
center[Nc].x=center[j].x;
center[Nc].z=center[j].z;
center[Nc].p=center[j].p;
center[Nc].y=center[j].y-a*sdm[j];
center[j].y=center[j].y+a*sdm[j];
Nc++;
}
}
if(u==sd[j].z)
{
sdm[j]=sd[j].z;
if(sdm[j]>S&&((Da[j]>Dl&&count[j]>2*(Nl+1))||Nc<=K/2))
{
center[Nc].x=center[j].x;
center[Nc].y=center[j].y;
center[Nc].p=center[j].p;
center[Nc].z=center[j].z-a*sdm[j];
center[j].z=center[j].z+a*sdm[j];
Nc++;
}
}
if(u==sd[j].p)
{
sdm[j]=sd[j].p;
if(sdm[j]>S&&((Da[j]>Dl&&count[j]>2*(Nl+1))||Nc<=K/2))
{
center[Nc].x=center[j].x;
center[Nc].z=center[j].z;
center[Nc].y=center[j].y;
center[Nc].p=center[j].p-a*sdm[j];
center[j].p=center[j].p+a*sdm[j];
Nc++;
}
}
}
if(Nc!=t) //进行了分裂处理
continue;
}
if(n==I) C=0; //最后一次迭代
//进行合并处理
t=0;
t1=-1;
t2=-1;
for(i=1;i<Nc;i++)
{
for(j=0;j<i;j++)
{
Dc[t]=distance(center[i],center[j]);
if(t>0&&Dc[t]<C&&Dc[t-1]>Dc[t])
Dc[t]=Dc[t-1];
else if(Dc[t]<C) { t1=j; t2=i; }//标记需要合并的
t++;
}
}
if(t1!=-1&&t2!=-1)
{
center[t1].x=(count[t1]*center[t1].x+count[t2]*center[t2].x)/(count[t1]+count[t2]);
center[t1].y=(count[t1]*center[t1].y+count[t2]*center[t2].y)/(count[t1]+count[t2]);
center[t1].z=(count[t1]*center[t1].z+count[t2]*center[t2].z)/(
isodata_iris.rar_cluster of iris da_isodata_isodata on the iris_
版权申诉
100 浏览量
2022-09-23
07:10:44
上传
评论
收藏 3KB RAR 举报
小波思基
- 粉丝: 72
- 资源: 1万+
最新资源
- Python毕业设计基于Django的网易云数据分析可视化大屏系统的设计与实现+使用说明+全部资料(优秀项目).zip
- Python毕业设计基于Django的网易云数据分析可视化大屏系统的设计与实现+使用说明+全部资料(高分项目).zip
- JavaScript实现的鼠标手势
- 人工兔优化算法ARO MATLAB源码, 应用案例为函数极值求解以及优化svm进行分类,代码注释详细,可结合自身需求进行应用
- 人才网站设计-asp.net+sql-(系统源码)
- asp.net+sql人才网站设计-含系统源码
- C#应用的用户配置窗体方案
- python实现绘制爱心图形的代码
- JAVAWEB项目-校园订餐系统项目源码.zip
- flink-1.19.0-bin-scala-2.12.tgz flink-1.16.3-bin-scala-2.12.tgz
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈