?? cluster.cpp
字號:
}
else break;//退出循環(huán)
}
}
/************************************************************
*函數(shù)名稱 Zhongjianjulifa()
*參數(shù) void
*返回值 void
*函數(shù)功能 按照中間距離法對全體樣品進行分類
*************************************************************/
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];//建立類間距離數(shù)組,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;
}
/************************************************************
*函數(shù)名稱 Zhongxinfa()
*參數(shù) void
*返回值 void
*函數(shù)功能 按照重心法對全體樣品進行分類
************************************************************/
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];//建立類間距離數(shù)組,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類中的元素個數(shù)
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--;
//重新計算類間距離,保持類號的連續(xù)性
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;
}
/************************************************************
*函數(shù)名稱 Leipingjunjulifa()
*參數(shù) void
*返回值 void
*函數(shù)功能 按照類平均距離法法對全體樣品進行分類
************************************************************/
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];//建立類間距離數(shù)組,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類中的元素個數(shù)
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--;
//對類間距離數(shù)組排序,以保持類號的連續(xù)性
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;
}
/************************************************************
*函數(shù)名稱 Kjunzhi()
*參數(shù) void
*返回值 void
*函數(shù)功能 按照K均值對全體樣品進行分類
************************************************************/
void CCluster::Kjunzhi()
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -