📄 cluster.cpp
字号:
}
else break;//退出循环
}
}
/************************************************************
*函数名称 Zhongjianjulifa()
*参数 void
*返回值 void
*函数功能 按照中间距离法对全体样品进行分类
*************************************************************/
void CCluster::Zhongjianjulifa()
{
GetFeature();
double **centerdistance;//记录类间距离
double T;//阈值
int distype;//距离的形式(欧氏、余弦。。。)
int i,j;
double minous,maxous,mincos,maxcos,minbcos,maxbcos,mintan,maxtan;
minous=MAX; mincos=MAX; minbcos=MAX; mintan=MAX;
maxous=0; maxcos=0; maxbcos=0; maxtan=0;
//计算四种距离模式的参考值
for ( i=0;i<patternnum-1;i++)
for ( j=i+1;j<patternnum;j++)
{
if (minous>GetDistance(m_pattern[i],m_pattern[j],1))
minous=GetDistance(m_pattern[i],m_pattern[j],1);
if (maxous<GetDistance(m_pattern[i],m_pattern[j],1))
maxous=GetDistance(m_pattern[i],m_pattern[j],1);
if (mincos>GetDistance(m_pattern[i],m_pattern[j],2))
mincos=GetDistance(m_pattern[i],m_pattern[j],2);
if (maxcos<GetDistance(m_pattern[i],m_pattern[j],2))
maxcos=GetDistance(m_pattern[i],m_pattern[j],2);
if (minbcos>GetDistance(m_pattern[i],m_pattern[j],3))
minbcos=GetDistance(m_pattern[i],m_pattern[j],3);
if (maxbcos<GetDistance(m_pattern[i],m_pattern[j],3))
maxbcos=GetDistance(m_pattern[i],m_pattern[j],3);
if (mintan>GetDistance(m_pattern[i],m_pattern[j],4))
mintan=GetDistance(m_pattern[i],m_pattern[j],4);
if (maxtan<GetDistance(m_pattern[i],m_pattern[j],4))
maxtan=GetDistance(m_pattern[i],m_pattern[j],4);
}
DlgInfor mDlgInfor;
mDlgInfor.ShowInfor(minous,maxous,mincos,maxcos,minbcos,maxbcos,mintan,maxtan);
if (mDlgInfor.DoModal()==IDOK)
{
T=mDlgInfor.m_T;
distype=mDlgInfor.m_DisType;
}
else return;
//初始化
for ( i=0;i<patternnum;i++)//每个样品自成一类
{
m_pattern[i].category=i+1;
}
centerdistance=new double *[patternnum];//建立类间距离数组,centerdistance[i][j]表示i类和j类距离
for ( i=1;i<patternnum;i++)
{
centerdistance[i]=new double [patternnum+1];
}
for ( i=1;i<patternnum;i++)
for (int j=i+1;j<=patternnum;j++)
{
centerdistance[i][j]=GetDistance(m_pattern[i-1],m_pattern[j-1],distype);
}
centernum=patternnum;
while(1)
{
double td,**tempdistance;
int ti,tj;
td=MAX;
ti=0;
tj=0;
tempdistance= new double *[patternnum];//临时记录类间距离
for (i=1;i<patternnum;i++)
{
tempdistance[i]=new double[patternnum+1];
}
for( i=1;i<centernum;i++)//找到距离最近的两类:ti,tj,记录最小距离td;
for ( j=i+1;j<=centernum;j++)
{
if (td>centerdistance[i][j])
{
td=centerdistance[i][j];
ti=i;tj=j;
}
}
if(td<T)//合并类i,j
{
for ( i=0;i<patternnum;i++)
{
if (m_pattern[i].category==tj)
m_pattern[i].category=ti;
if (m_pattern[i].category>tj)
m_pattern[i].category--;
}
centernum--;
for (i=1;i<centernum;i++)//重新计算合并后的类到其他各类的新距离
for ( j=i+1;j<=centernum;j++)
{
if (i<ti)
{
if(j==ti)
tempdistance[i][j]=sqrt (centerdistance[i][ti]*centerdistance[i][ti]/2+centerdistance[i][tj]*centerdistance[i][tj]/2-centerdistance[ti][tj]*centerdistance[ti][tj]/4);
else if (j>=tj)
tempdistance[i][j]=centerdistance[i][j+1];
else
tempdistance[i][j]=centerdistance[i][j];
}
else if (i==ti)
{
if (j<tj)
tempdistance[i][j]=sqrt (centerdistance[ti][j]*centerdistance[ti][j]/2+centerdistance[j][tj]*centerdistance[j][tj]/2-centerdistance[ti][tj]*centerdistance[ti][tj]/4);
else
tempdistance[i][j]=sqrt (centerdistance[ti][j+1]*centerdistance[ti][j+1]/2+centerdistance[tj][j+1]*centerdistance[tj][j+1]/2-centerdistance[ti][tj]*centerdistance[ti][tj]/4);
}
else if((i>ti)&&(i<tj))
{
if(j<tj)
tempdistance[i][j]=centerdistance[i][j];
else
tempdistance[i][j]=centerdistance[i][j+1];
}
else //i>=tj
{
tempdistance[i][j]=centerdistance[i+1][j+1];
}
}
for (i=1;i<centernum;i++)
for ( j=i+1;j<=centernum;j++)
{
centerdistance[i][j]=tempdistance[i][j];
}
}
else break;
delete []tempdistance;
}
delete []centerdistance;
}
/************************************************************
*函数名称 Zhongxinfa()
*参数 void
*返回值 void
*函数功能 按照重心法对全体样品进行分类
************************************************************/
void CCluster::Zhongxinfa()
{
GetFeature();
double **centerdistance;//记录类间距离
double T;//阈值
int distype;//距离的形式(欧氏、余弦。。。)
int i,j;
double minous,maxous,mincos,maxcos,minbcos,maxbcos,mintan,maxtan;
minous=MAX; mincos=MAX; minbcos=MAX; mintan=MAX;
maxous=0; maxcos=0; maxbcos=0; maxtan=0;
//计算四种距离模式的参考值
for ( i=0;i<patternnum-1;i++)
for ( j=i+1;j<patternnum;j++)
{
if (minous>GetDistance(m_pattern[i],m_pattern[j],1))
minous=GetDistance(m_pattern[i],m_pattern[j],1);
if (maxous<GetDistance(m_pattern[i],m_pattern[j],1))
maxous=GetDistance(m_pattern[i],m_pattern[j],1);
if (mincos>GetDistance(m_pattern[i],m_pattern[j],2))
mincos=GetDistance(m_pattern[i],m_pattern[j],2);
if (maxcos<GetDistance(m_pattern[i],m_pattern[j],2))
maxcos=GetDistance(m_pattern[i],m_pattern[j],2);
if (minbcos>GetDistance(m_pattern[i],m_pattern[j],3))
minbcos=GetDistance(m_pattern[i],m_pattern[j],3);
if (maxbcos<GetDistance(m_pattern[i],m_pattern[j],3))
maxbcos=GetDistance(m_pattern[i],m_pattern[j],3);
if (mintan>GetDistance(m_pattern[i],m_pattern[j],4))
mintan=GetDistance(m_pattern[i],m_pattern[j],4);
if (maxtan<GetDistance(m_pattern[i],m_pattern[j],4))
maxtan=GetDistance(m_pattern[i],m_pattern[j],4);
}
DlgInfor mDlgInfor;
mDlgInfor.ShowInfor(minous,maxous,mincos,maxcos,minbcos,maxbcos,mintan,maxtan);
if (mDlgInfor.DoModal()==IDOK)
{
T=mDlgInfor.m_T;
distype=mDlgInfor.m_DisType;
}
else return;
//初始化
for ( i=0;i<patternnum;i++)//每个样品自成一类
{
m_pattern[i].category=i+1;
}
centerdistance=new double *[patternnum];//建立类间距离数组,centerdistance[i][j]表示i类和j类距离
for ( i=1;i<patternnum;i++)
{
centerdistance[i]=new double [patternnum+1];
}
for ( i=1;i<patternnum;i++)
for (int j=i+1;j<=patternnum;j++)
{
centerdistance[i][j]=GetDistance(m_pattern[i-1],m_pattern[j-1],distype);
}
centernum=patternnum;
while(1)
{
double td,**tempdistance;
int ti,tj;//距离最小的类
int numi,numj;//i,j类中的元素个数
td=MAX;
ti=0;
tj=0;
numi=0;
numj=0;
tempdistance= new double *[patternnum];//临时记录类间距离
for (i=1;i<patternnum;i++)
{
tempdistance[i]=new double[patternnum+1];
}
for( i=1;i<centernum;i++)//找到距离最近的两类:ti,tj,记录最小距离td;
for ( j=i+1;j<=centernum;j++)
{
if (td>centerdistance[i][j])
{
td=centerdistance[i][j];
ti=i;tj=j;
}
}
if(td<T)//最小距离小于阈值,合并类i,j
{
for (int i=0;i<patternnum;i++)
{
if (m_pattern[i].category==ti)
numi++;
if (m_pattern[i].category==tj)
{
m_pattern[i].category=ti;
numj++;
}
if (m_pattern[i].category>tj)
m_pattern[i].category--;
}
centernum--;
//重新计算类间距离,保持类号的连续性
for (i=1;i<centernum;i++)
for (int j=i+1;j<=centernum;j++)
{
if (i<ti)
{
if(j==ti)
tempdistance[i][j]=sqrt (centerdistance[i][ti]*centerdistance[i][ti]*numi/(numi+numj)+centerdistance[i][tj]*centerdistance[i][tj]*numj/(numi+numj)-centerdistance[ti][tj]*centerdistance[ti][tj]*numi*numj/(numi+numj));
else if (j>=tj)
tempdistance[i][j]=centerdistance[i][j+1];
else
tempdistance[i][j]=centerdistance[i][j];
}
else if (i==ti)
{
if (j<tj)
tempdistance[i][j]=sqrt (centerdistance[ti][j]*centerdistance[ti][j]*numi/(numi+numj)+centerdistance[j][tj]*centerdistance[j][tj]*numj/(numi+numj)-centerdistance[ti][tj]*centerdistance[ti][tj]*numi*numj/(numi+numj));
else
tempdistance[i][j]=sqrt (centerdistance[ti][j+1]*centerdistance[ti][j+1]*numi/(numi+numj)+centerdistance[tj][j+1]*centerdistance[tj][j+1]*numj/(numi+numj)-centerdistance[ti][tj]*centerdistance[ti][tj]*numi*numj/(numi+numj));
}
else if((i>ti)&&(i<tj))
{
if(j<tj)
tempdistance[i][j]=centerdistance[i][j];
else
tempdistance[i][j]=centerdistance[i][j+1];
}
else //i>=tj
{
tempdistance[i][j]=centerdistance[i+1][j+1];
}
}
for (i=1;i<centernum;i++)
for (int j=i+1;j<=centernum;j++)
{
centerdistance[i][j]=tempdistance[i][j];
}
}//end if(td<T)
else break;
delete []tempdistance;
}
delete []centerdistance;
}
/************************************************************
*函数名称 Leipingjunjulifa()
*参数 void
*返回值 void
*函数功能 按照类平均距离法法对全体样品进行分类
************************************************************/
void CCluster::Leipingjunjulifa()
{
GetFeature();
double **centerdistance;//记录类间距离
double T;//阈值
int distype;//距离的形式(欧氏、余弦。。。)
double minous,maxous,mincos,maxcos,minbcos,maxbcos,mintan,maxtan;
minous=MAX; mincos=MAX; minbcos=MAX; mintan=MAX;
maxous=0; maxcos=0; maxbcos=0; maxtan=0;
//计算四种距离模式的参考值
for (int i=0;i<patternnum-1;i++)
for (int j=i+1;j<patternnum;j++)
{
if (minous>GetDistance(m_pattern[i],m_pattern[j],1))
minous=GetDistance(m_pattern[i],m_pattern[j],1);
if (maxous<GetDistance(m_pattern[i],m_pattern[j],1))
maxous=GetDistance(m_pattern[i],m_pattern[j],1);
if (mincos>GetDistance(m_pattern[i],m_pattern[j],2))
mincos=GetDistance(m_pattern[i],m_pattern[j],2);
if (maxcos<GetDistance(m_pattern[i],m_pattern[j],2))
maxcos=GetDistance(m_pattern[i],m_pattern[j],2);
if (minbcos>GetDistance(m_pattern[i],m_pattern[j],3))
minbcos=GetDistance(m_pattern[i],m_pattern[j],3);
if (maxbcos<GetDistance(m_pattern[i],m_pattern[j],3))
maxbcos=GetDistance(m_pattern[i],m_pattern[j],3);
if (mintan>GetDistance(m_pattern[i],m_pattern[j],4))
mintan=GetDistance(m_pattern[i],m_pattern[j],4);
if (maxtan<GetDistance(m_pattern[i],m_pattern[j],4))
maxtan=GetDistance(m_pattern[i],m_pattern[j],4);
}
DlgInfor mDlgInfor;
mDlgInfor.ShowInfor(minous,maxous,mincos,maxcos,minbcos,maxbcos,mintan,maxtan);
if (mDlgInfor.DoModal()==IDOK)
{
T=mDlgInfor.m_T;
distype=mDlgInfor.m_DisType;
}
else return;
//初始化
for ( i=0;i<patternnum;i++)//每个样品自成一类
{
m_pattern[i].category=i+1;
}
centerdistance=new double *[patternnum];//建立类间距离数组,centerdistance[i][j]表示i类和j类距离
for ( i=1;i<patternnum;i++)
{
centerdistance[i]=new double [patternnum+1];
}
for ( i=1;i<patternnum;i++)
for (int j=i+1;j<=patternnum;j++)
{
centerdistance[i][j]=GetDistance(m_pattern[i-1],m_pattern[j-1],distype);
}
centernum=patternnum;
while(1)
{
double td,**tempdistance;
int ti,tj;//距离最小的类
int numi,numj;//i,j类中的元素个数
double dis1,dis2;
dis1=0;
dis2=0;
td=MAX;
ti=0;
tj=0;
numi=0;
numj=0;
tempdistance= new double *[patternnum];//临时记录类间距离
for (int i=1;i<patternnum;i++)
{
tempdistance[i]=new double[patternnum+1];
}
//找距离最近的两类ti,tj,记录最小距离td
for( i=1;i<centernum;i++)
{
for (int j=i+1;j<=centernum;j++)
{
if (td>centerdistance[i][j])
{
td=centerdistance[i][j];
ti=i;tj=j;
}
}
}
if(td<T)//合并类ti,tj
{
centernum--;
//对类间距离数组排序,以保持类号的连续性
for (int i=1;i<centernum;i++)
for (int j=i+1;j<=centernum;j++)
{
if (i<ti)
{
if(j==ti)
{
numi=0;numj=0;
dis1=0;dis2=0;
for (int m=0;m<patternnum;m++)
if (m_pattern[m].category==i)
{
for (int n=0;n<patternnum;n++)
{
if (m_pattern[n].category==ti)
{
numi++;
dis1+=GetDistance(m_pattern[m],m_pattern[n],distype)*GetDistance(m_pattern[m],m_pattern[n],distype);
}
if(m_pattern[n].category==tj)
{
numj++;
dis2+=GetDistance(m_pattern[m],m_pattern[n],distype)*GetDistance(m_pattern[m],m_pattern[n],distype);
}
}
}
tempdistance[i][j]=sqrt((dis1+dis2)/(numi+numj));
}
else if (j>=tj)
tempdistance[i][j]=centerdistance[i][j+1];
else
tempdistance[i][j]=centerdistance[i][j];
}
else if (i==ti)
{
if (j<tj)
{
numi=0;numj=0;
dis1=0;dis2=0;
for (int m=0;m<patternnum;m++)
if (m_pattern[m].category==j)
{
for (int n=0;n<patternnum;n++)
{
if (m_pattern[n].category==ti)
{
numi++;
dis1+=GetDistance(m_pattern[m],m_pattern[n],distype)*GetDistance(m_pattern[m],m_pattern[n],distype);
}
if(m_pattern[n].category==tj)
{
numj++;
dis2+=GetDistance(m_pattern[m],m_pattern[n],distype)*GetDistance(m_pattern[m],m_pattern[n],distype);
}
}
}
tempdistance[i][j]=sqrt((dis1+dis2)/(numi+numj));
}
else
{
numi=0;numj=0;
dis1=0;dis2=0;
for (int m=1;m<=patternnum;m++)
if (m_pattern[m].category==(j+1))
{
for (int n=1;n<=patternnum;n++)
{
if (m_pattern[n].category==ti)
{
numi++;
dis1+=GetDistance(m_pattern[m],m_pattern[n],distype)*GetDistance(m_pattern[m],m_pattern[n],distype);
}
if(m_pattern[n].category==tj)
{
numj++;
dis2+=GetDistance(m_pattern[m],m_pattern[n],distype)*GetDistance(m_pattern[m],m_pattern[n],distype);
}
}
}
tempdistance[i][j]=sqrt((dis1+dis2)/(numi+numj));
}
}
else if((i>ti)&&(i<tj))
{
if(j<tj)
tempdistance[i][j]=centerdistance[i][j];
else
tempdistance[i][j]=centerdistance[i][j+1];
}
else //i>=tj
{
tempdistance[i][j]=centerdistance[i+1][j+1];
}
}
for (i=1;i<centernum;i++)
for (int j=i+1;j<=centernum;j++)
{
centerdistance[i][j]=tempdistance[i][j];
}
for ( i=0;i<patternnum;i++)
{
if (m_pattern[i].category==tj)
m_pattern[i].category=ti;
if (m_pattern[i].category>tj)
m_pattern[i].category--;
}
delete []tempdistance;
}//end if(td<T)
else break;
}//end while
delete []centerdistance;
}
/************************************************************
*函数名称 Kjunzhi()
*参数 void
*返回值 void
*函数功能 按照K均值对全体样品进行分类
************************************************************/
void CCluster::Kjunzhi()
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -