📄 isodata.cpp
字号:
{
cout<<endl<<"更新类中心开始!!"<<endl;
int i,j,k;
double average;
for(i=0;i<CenterNum;i++)
for(j=0;j<InDim;j++)
{
average=0;
for(k=0;k<m_center[i].HasSampleNum;k++)
average+=m_sample[m_center[i].HasSample[k]].SFeature[j];
m_center[i].CFeature[j]=average/static_cast<double>(m_center[i].HasSampleNum);
}
cout<<endl<<"更新类中心结束!!"<<endl;
};
/************************************************************************/
/* 计算每一类内平均距离 */
/************************************************************************/
void CalCenterDist()
{
cout<<endl<<"计算每一类内平均距离开始!!"<<endl;
int i,j;
double avgdist;
for(i=0;i<CenterNum;i++)
{
avgdist=0;
for(j=0;j<m_center[i].HasSampleNum;j++)
{
cout<<"m_center["<<i<<"].HasSampleNum="<<m_center[i].HasSampleNum<<endl;
avgdist+=GetDistance(m_center[i].CFeature,m_sample[m_center[i].HasSample[j]].SFeature);
}
AvgDistance[i]=avgdist/static_cast<double>(m_center[i].HasSampleNum);
}
cout<<endl<<"计算每一类内平均距离结束!!"<<endl;
}
/************************************************************************/
/* 计算所有类的平均距离 */
/************************************************************************/
void CalAllAvgDist()
{
cout<<endl<<"计算所有类的平均距离开始!!"<<endl;
int i;
double avgdist=0.0;
for(i=0;i<CenterNum;i++)
avgdist+=AvgDistance[i]*m_center[i].HasSampleNum;
AllAvgDist=avgdist/static_cast<double>(SamNum);
cout<<endl<<"计算所有类的平均距离结束!!"<<endl;
}
/************************************************************************/
/* 计算每一类的标准差 */
/************************************************************************/
void CalStanDeviation()
{
cout<<endl<<"计算每一类的标准差开始!!"<<endl;
int i,j,k;
for(i=0;i<CenterNum;i++)
{
float tem[InDim]={0.0};
for(j=0;j<InDim;j++)
{
for(k=0;k<m_center[i].HasSampleNum;k++)
tem[j]+=(m_sample[m_center[i].HasSample[k]].SFeature[j]-m_center[i].CFeature[j])*(m_sample[m_center[i].HasSample[k]].SFeature[j]-m_center[i].CFeature[j]);
m_center[i].StanDeviation[j]=sqrt(tem[j]/static_cast<double>(m_center[i].HasSampleNum));
}
}
cout<<endl<<"计算每一类的标准差结束!!"<<endl;
}
/************************************************************************/
/* 找出每一类的标准差最大分量 */
/************************************************************************/
void FindMaxStanDeviation()
{
cout<<endl<<"找出每一类的标准差最大分量开始!!"<<endl;
int i,j;
double temp=0;
for(i=0;i<CenterNum;i++)
{
m_center[i].MaxStanDev=m_center[i].StanDeviation[0];
for(j=0;j<InDim;j++)
if(m_center[i].MaxStanDev<m_center[i].StanDeviation[j])
{
m_center[i].MaxStanDev=m_center[i].StanDeviation[j];
m_center[i].MaxStanDevIndex=j;
}
}
cout<<endl<<"找出每一类的标准差最大分量结束!!"<<endl;
}
/************************************************************************/
/* 将一类分裂为两类 */
/************************************************************************/
void Split(int i)
{
cout<<endl<<"将一类分裂为两类开始!!"<<endl;
cout<<"被分裂的是第"<<i+1<<"类!"<<endl;
int j;
float Gama=0.5;
Center centerposi,centerneg;
centerposi.CenterIndex=m_center[i].CenterIndex;
for(j=0;j<InDim;j++)
{
centerposi.CFeature[j]=centerneg.CFeature[j]=m_center[i].CFeature[j];
cout<<"centerposi.CFeature["<<j<<"]=centerneg.CFeature["<<j<<"]="<<centerposi.CFeature[j]<<endl;
if(j==m_center[i].MaxStanDevIndex)
{
centerposi.CFeature[j]=m_center[i].CFeature[j]+Gama*m_center[i].MaxStanDev;
centerneg.CFeature[j]=m_center[i].CFeature[j]-Gama*m_center[i].MaxStanDev;
}
}
m_center[i]=centerposi;
m_center[CenterNum]=centerneg;
flag2=true;
cout<<endl<<"将一类分裂为两类结束!!"<<endl;
}
/************************************************************************/
/* 计算两两中心间的距离 */
/************************************************************************/
void Cal22CenterDist()
{
cout<<endl<<"计算两两中心间的距离开始!!"<<endl;
int i,j;
for(i=0;i<CenterNum;i++)
for(j=0;j<CenterNum;j++)
{
Distij[ss]=GetDistance(m_center[i].CFeature,m_center[j].CFeature);
Disti[ss]=i;
Distj[ss]=j;
ss++;
}
cout<<endl<<"计算两两中心间的距离结束!!"<<endl;
}
/************************************************************************/
/* 按CenterDist排序 */
/************************************************************************/
void Taxis()
{
cout<<endl<<"按CenterDist排序开始!!"<<endl;
int i,j;
double temp1;
int temp2;
for(i=0;i<ss-1;i++)
for(j=i+1;j<ss;j++)
if(Distij[i]>Distij[j])
{
temp1=Distij[i];
Distij[i]=Distij[j];
Distij[j]=temp1;
temp2=Disti[i];
Disti[i]=Disti[j];
Disti[j]=temp2;
temp2=Distj[i];
Distj[i]=Distj[j];
Distj[j]=temp2;
}
for(i=0;i<ss;i++)
if(Distij[i]>0&&Distij[i]<=MinCenterDist)
{
sss=i;
flag3=true;
break;
}
cout<<endl<<"按CenterDist排序结束!!"<<endl;
}
/************************************************************************/
/* 归并一对(一次只归并一对) */
/************************************************************************/
void Combination()
{
cout<<endl<<"归并一对开始!!"<<endl;
int i,j,k;
double tempcenterfea[InDim]={0};
for(i=0;i<InDim;i++)
{
tempcenterfea[i]=m_center[Disti[sss]].HasSampleNum*m_center[Disti[sss]].CFeature[i];
tempcenterfea[i]+=m_center[Distj[sss]].HasSampleNum*m_center[Distj[sss]].CFeature[i];
m_center[Disti[sss]].CFeature[i]=tempcenterfea[i]/static_cast<double>(m_center[Disti[sss]].HasSampleNum+m_center[Distj[sss]].HasSampleNum);
}
for(i=Distj[sss];i<CenterNum-1;i++)
m_center[i]=m_center[i+1];
CenterNum--;
cout<<endl<<"归并一对结束!!"<<endl;
}
/************************************************************************/
/* 输出分类结果 */
/************************************************************************/
void ShowResults()
{
cout<<endl<<"输出分类结果开始!!"<<endl;
int i,j;
ofstream outfile;
outfile.open("result.txt");
outfile<<"总共"<< SamNum<<"组数据:"<<endl<<endl;
for(i=0;i<CenterNum;i++)
{ outfile<<endl<<"-----------------------------------------------"<<endl<<endl;
outfile<<"分在第"<<i+1<<"类的组数为:"<<endl<<endl;
for(j=0;j<m_center[i].HasSampleNum;j++)
{
outfile<<setw(5)<<m_center[i].HasSample[j];
if(j%5==4) outfile<<endl;
}
outfile<<endl<<endl<<"第"<<i+1<<"类共有"<<m_center[i].HasSampleNum<<"组数据。"<<endl;
outfile<<endl<<" 第"<<i+1<<"类的中心是:"<<endl<<endl;
for(j=0;j<InDim;j++)
outfile<<setw(10)<<m_center[i].CFeature[j];
outfile<<endl<<endl<<"此类的各分量的标准差为"<<endl<<endl;
for(j=0;j<InDim;j++)
outfile<<setw(10)<<m_center[i].StanDeviation[j];
outfile<<endl<<endl<<"-----------------------------------------------"<<endl<<endl;
}
outfile<<endl<<endl<<"各类中心间的距离:"<<endl<<endl;
for(i=0;i<CenterNum;i++)
outfile<<" 第"<<i+1<<"类";
outfile<<endl;
for(i=0;i<CenterNum;i++)
{
outfile<<"第"<<j+1<<"类";
for(j=0;j<CenterNum;j++)
outfile<<setw(10)<<Distij[i][j];
outfile<<endl;
}
outfile.close();
cout<<endl<<"输出分类结果结束!!"<<endl;
};
int main()
{
int i,j;
cout<<endl;
step1:
SetParameter();
PutinData();
CreateRandomCenters();
step2_3:
do
{ InitiateCenters();
ClassJudge();
flag1=false;
DecreaseCenters();
}while(flag1);
step4:
UpdateCenter();
step5:
CalCenterDist();
step6:
CalAllAvgDist();
step7:
if(MergerTimes>=MaxMergerTimes)
goto step14;
if(CenterNum<=ExpectCenterNum/2)
{
MinCenterDist-0;
goto step8;
}
if((MergerTimes%2==0)||CenterNum>=2*ExpectCenterNum)
goto step11;
step8:
CalStanDeviation();
step9:
FindMaxStanDeviation();
step10:
for(i=0;i<CenterNum;i++)
if(m_center[i].MaxStanDev>MaxStanDeviation)
if((AvgDistance[i]>AllAvgDist&&m_center[i].HasSampleNum>2*MinSampleNum+1)||CenterNum<=ExpectCenterNum/2)
Split(i);
if(flag2)
{
CenterNum++;
goto step2_3;
}
step11:
Cal22CenterDist();
step12:
Taxis();
step13:
if(flag3) Combination();
step14:
if(MergerTimes>=MaxMergerTimes)
goto step15;
else
goto step2_3;
step15:
ShowResults();
cout<<endl<<"分类成功!!"<<endl;
system("pause");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -