⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 outdd.cpp

📁 基于四个特征值的聚类方法 K-均值算法
💻 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 + -