📄 mergecenter.cpp
字号:
#include<iostream.h>
#include<fstream.h>
#include<math.h>
#include<stdlib.h>
#define jingdu 0.1
class MergerCenter
{
private:
float center[2][4];//原先的聚类中心;
float center_new[2][4];
float source[600];
float data[150][4];
int clustering1[150];
int clustering2[150];
ofstream outfile;
public:
MergerCenter();
~MergerCenter();
void PutinData();
void classfiy(int,int);
void FirstMerger();
void ClassJudge(int);
void MakeNewCenter();
void SecondMerger();
void ThirdMerger();
void AllMerger();
};
MergerCenter::MergerCenter()
{
int i,j;
for(i=0;i<2;i++)
for(j=0;j<4;j++)
{
center[i][j]=0;
center_new[i][j]=0;
}
for(i=0;i<600;i++)
source[i]=0;
for(i=0;i<150;i++)
for(j=0;j<4;j++)
data[i][j]=0;
for(i=0;i<150;i++)
{
clustering1[i]=0;
clustering2[i]=0;
}
outfile.open("result.txt");
cout=outfile;
}
MergerCenter::~MergerCenter()
{
outfile.close();
}
void MergerCenter::PutinData()
{
int count = 0;
float temp=0;
int i=0,j=0;
ifstream in("data.txt");
if(!in)
{
cout<<"Can't Open the file"<<endl;
exit(1);
}
while(in>>temp)
{
source[count]=temp;
count++;
}
for(i=0;i<150;i++)
for(j=0;j<4;j++)
{
data[i][j]=source[i*4+j];
}
in.close();
}
void MergerCenter::classfiy(int increase,int isAll)
{
int i,j;
bool flag;
/*将clustering中数据清0*/
for(i=0;i<150;i++)
{
clustering1[i]=0;
clustering2[i]=0;
}
for(j=0;j<4;j++)
{
center[0][j]=data[0][j];
center[1][j]=data[1][j];
}
while(1)
{
flag = true;
for(i=0+increase-isAll;i<50+increase;i++)
{
ClassJudge(i); //分成2类;更新clustering1,2中的数据
}
/*根据clustering1,2中的数据求出center_new*/
MakeNewCenter();
for(j=0;j<4;j++)
{
if(center[0][j]!=center_new[0][j]||center[1][j]!=center_new[1][j])
{
flag=false;
break;
}
}
if(!flag) //更新center
{
for(j=0;j<4;j++)
{
center[0][j]=center_new[0][j];
center[1][j]=center_new[1][j];
}
for(i=0;i<150;i++)
{
clustering1[i]=0;
clustering2[i]=0;
}
}
else
{
cout<<"第一类中心点的数据为";//显示;
cout<<'(';
for(j=0;j<4;j++)
{
cout<<center[0][j];
if(j!=3)
cout<<',';
else
cout<<')';
}
cout<<endl;
cout<<endl;
cout<<"第二类中心点的数据为";//显示;
cout<<'(';
for(j=0;j<4;j++)
{
cout<<center[1][j];
if(j!=3)
cout<<',';
else
cout<<')';
}
cout<<endl;
cout<<endl;
break;
}
}//end while(1)
}
void MergerCenter::ClassJudge(int i)
{
int row,lie;
float average1 = 0;//平方和开方;
float average2 = 0;
float sum1 = 0; //平方和
float sum2 = 0;
int count1 = 0;//clustering1非0个数
int count2 = 0;
for(lie=0;lie<4;lie++)
{
sum1+=(data[i][lie]-center[0][lie])*(data[i][lie]-center[0][lie]);
sum2+=(data[i][lie]-center[1][lie])*(data[i][lie]-center[1][lie]);
}
average1 = (float)sqrt(sum1);
average2 = (float)sqrt(sum2);
for(row = 0;row < 150;row++)
{
if(clustering1[row]!=0)
count1++;
else
break;
}
for(row = 0;row < 150;row++)
{
if(clustering2[row]!=0)
count2++;
else
break;
}
if(average1<average2)
clustering1[count1]=i+1;
else
clustering2[count2]=i+1;
}
void MergerCenter::MakeNewCenter()
{
int row,lie;
int i,j;
int count1 = 0; // clustering1中非0数据;
int count2 = 0;
for(row = 0;row < 150;row++)
{
if(clustering1[row]!=0)
count1++;
else
break;
}
for(row = 0;row < 150;row++)
{
if(clustering2[row]!=0)
count2++;
else
break;
}
for(i=0;i<2;i++)
for(j=0;j<4;j++)
{
center_new[i][j]=0;
}
for(lie=0;lie<4;lie++)
{
for(row=0;row<count1;row++)
{
center_new[0][lie]+=data[clustering1[row]-1][lie];
}
center_new[0][lie]=center_new[0][lie]/count1;
}
for(lie=0;lie<4;lie++)
{
for(row=0;row<count2;row++)
{
center_new[1][lie]+=data[clustering2[row]-1][lie];
}
center_new[1][lie]=center_new[1][lie]/count2;
}
}
void MergerCenter::FirstMerger()
{
int i;
cout<<"前50组数据:"<<endl;
cout<<endl;
classfiy(0,0);
cout<<"前50组数据分在第一类的组数为:";
for(i=0;i<150;i++)
{
if(clustering1[i]!=0)
{
cout<<clustering1[i]<<' ';
}
else
break;
}
cout<<endl;
cout<<endl;
cout<<"前50组数据分在第二类的组数为:";
for(i=0;i<150;i++)
{
if(clustering2[i]!=0)
{
cout<<clustering2[i]<<' ';
}
else
break;
}
cout<<endl;
cout<<endl;
}
void MergerCenter::SecondMerger()
{
int i;
cout<<"第51到100组数据:"<<endl;
cout<<endl;
classfiy(50,0);
cout<<"第51到100组数据分在第一类的组数为:";
for(i=0;i<150;i++)
{
if(clustering1[i]!=0)
{
cout<<clustering1[i]<<' ';
}
else
break;
}
cout<<endl;
cout<<endl;
cout<<"第51到100组数据分在第二类的组数为:";
for(i=0;i<150;i++)
{
if(clustering2[i]!=0)
{
cout<<clustering2[i]<<' ';
}
else
break;
}
cout<<endl;
cout<<endl;
}
void MergerCenter::ThirdMerger()
{
int i;
cout<<"第101到150组数据:"<<endl;
cout<<endl;
classfiy(100,0);
cout<<"第101到150组数据分在第一类的组数为:";
for(i=0;i<150;i++)
{
if(clustering1[i]!=0)
{
cout<<clustering1[i]<<' ';
}
else
break;
}
cout<<endl;
cout<<endl;
cout<<"第101到150组数据分在第二类的组数为:";
for(i=0;i<150;i++)
{
if(clustering2[i]!=0)
{
cout<<clustering2[i]<<' ';
}
else
break;
}
cout<<endl;
cout<<endl;
}
void MergerCenter::AllMerger()
{
int i;
cout<<"总150组数据:"<<endl;
classfiy(100,100);
cout<<"总150组数据分在第一类的组数为:";
for(i=0;i<150;i++)
{
if(clustering1[i]!=0)
{
cout<<clustering1[i]<<' ';
}
else
break;
}
cout<<endl;
cout<<endl;
cout<<"总150组数据分在第二类的组数为:";
for(i=0;i<150;i++)
{
if(clustering2[i]!=0)
{
cout<<clustering2[i]<<' ';
}
else
break;
}
cout<<endl;
cout<<endl;
}
void main()
{
MergerCenter merger;
merger.PutinData();
merger.FirstMerger();
merger.SecondMerger();
merger.ThirdMerger();
merger.AllMerger();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -