📄 outdd.cpp
字号:
#include<stdio.h>
#include<math.h>
#include<iostream>
using namespace std;
void main()
{
char test='q';
int i,j,sn1=0,sn2=0,n=0,sn3=0,sn4=0,sn5=0;
float z1x,z1y,z1z,z1h,z2x,z2y,z2z,z2h,z1x_l,z1y_l,z1z_l,z1h_l,z2x_l,z2y_l,z2z_l,z2h_l;
float X[100][4],S1[100][4],S2[100][4];
/****************************数据输入******************************************/
while(test!=27)
{
printf("Please input the numble of the data:");
scanf("%d",&n);
printf("Please input data\n");
for(i=0;i<n;i++)
{
for(j=0;j<4;j++)
{
if(j==0)
{
printf("X[%d]x=",i+1);
scanf("%f",&X[i][j]);
}
else
{
printf("X[%d]y=",i+1);
scanf("%f",&X[i][j]);
}
}
}
/*
printf("Please input K\n");
scanf("%d",&K);
*/
/*******************************算法过程***************************************/
z1x=z1x_l=X[0][0];//初始化聚类中心
z1y=z1y_l=X[0][1];
z1z=z1z_l=X[0][2];
z1h=z1h_l=X[0][3];
z2x=z2x_l=X[1][0];
z2y=z2y_l=X[1][1];
z2z=z2z_l=X[1][2];
z2h=z2h_l=X[1][3];
/********************迭代开始*********************/
again:
/*************计算数据点分类**************/
sn1=0;
sn2=0;
for(i=0;i<n;i++)
{
if(((X[i][0]-z1x)*(X[i][0]-z1x)+(X[i][1]-z1y)*(X[i][1]-z1y)+(X[i][2]-z1z)*(X[i][2]-z1z)+(X[i][3]-z1h)*(X[i][3]-z1h))<((X[i][0]-z2x)*(X[i][0]-z2x)+(X[i][1]-z2y)*(X[i][1]-z2y)+(X[i][2]-z2z)*(X[i][2]-z2z)+(X[i][3]-z2h)*(X[i][3]-z2h)))//判断数据所属
{
S1[sn1][0]=X[i][0];
S1[sn1][1]=X[i][1];
S1[sn1][2]=X[i][2];
S1[sn1][3]=X[i][3];
sn1++;
}
else
{
S2[sn2][0]=X[i][0];
S2[sn2][1]=X[i][1];
S2[sn2][2]=X[i][2];
S2[sn2][3]=X[i][3];
sn2++;
}
}
/*************计算聚类中心**************/
z1x=0;
z1y=0;
z1z=0;
z1h=0;
for(i=0;i<sn1;i++)
{
z1x=(S1[i][0]+z1x);
z1y=(S1[i][1]+z1y);
z1z=(S1[i][2]+z1z);
z1h=(S1[i][3]+z1h);
}
z1x=z1x/(sn1);
z1y=z1y/(sn1);
z1z=z1z/(sn1);
z1h=z1h/(sn1);
z2x=0;
z2y=0;
z2z=0;
z2h=0;
for(i=0;i<sn2;i++)
{
z2x=(S2[i][0]+z2x);
z2y=(S2[i][1]+z2y);
z2z=(S2[i][2]+z2z);
z2h=(S2[i][3]+z2h);
}
z2x=z2x/(sn2);
z2y=z2y/(sn2);
z2z=z2z/(sn2);
z2h=z2h/(sn2);
/*************判断聚类中心**************/
if((z1x!=z1x_l)||(z1y!=z1y_l)||(z2x!=z2x_l)||(z2y!=z2y_l)||(z1z!=z1z_l)||(z1h!=z1h_l)||(z2z!=z2z_l)||(z2h!=z2h_l))
{
z1x_l=z1x;
z1y_l=z1y;
z1z_l=z1z;
z1h_l=z1h;
z2x_l=z2x;
z2y_l=z2y;
z2z_l=z2z;
z2h_l=z2h;
goto again;//有时候goto还是很好用的,这里判断迭代得出的聚类中心的值是否与上次相同,不同继续迭代
}
cout<<"the first: ";
for(int h=0; h< sn1;h++)
{
for(int k=0;k<n;k++)
{
if((S1[h][0]==X[k][0])&&(S1[h][1]==X[k][1])&&(S1[h][2]==X[k][2])&&(S1[h][3]==X[k][3]))
{
cout<<k<<" ";
break;
}
}
}
cout<<endl;
cout<<"the second: ";
for(int g=0; g< sn2;g++)
{
for(int k=0;k<n;k++)
{
if((S2[g][0]==X[k][0])&&(S2[g][1]==X[k][1])&&(S2[g][2]==X[k][2])&&(S2[g][3]==X[k][3]))
{
cout<<k<<" ";
break;
}
}
}
cout<<endl;
/*******************************打印结果***************************************/
printf("%f,%f,%f,%f,%f,%f,%f,%f\nRress Esc to close\nRress any key to continue\n ",z1x,z1y,z1z,z1h,z2x,z2y,z2z,z2h);
//test=getch(); //按ESC退出
}//回while
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -