📄 file1.cpp
字号:
//------------------------------------------------------------------------------
#include "unit1.h"
#include <math.h>
//聚类初始化,指定前三个样本分别为三类中心
void TForm1::InitClusters()
{
/*ClusterMember[0][0]=0;
ClusterMember[0][0]=50;
ClusterMember[0][0]=100;
for(int j=0;j<4;j++)
{
ClusterCenter[0][j]=Pattern[0][j];
ClusterCenter[1][j]=Pattern[50][j];
ClusterCenter[2][j]=Pattern[100][j];
} */
int i,j;
for(i=0;i<3;i++)
{
ClusterMember[i][0]=i;
for(j=0;j<4;j++)
ClusterCenter[i][j]=Pattern[i][j];
}
}
//欧式范数计算
double TForm1::EucNorm(int p,int c)
{
double dist;
int i;
dist=0;
for(i=0;i<4;i++)
dist+=(Pattern[p][i]-ClusterCenter[c][i])*(Pattern[p][i]-ClusterCenter[c][i]);
return dist;
}
//求离样本最近的聚类中心
int TForm1::FindClosestCluster(int pat)
{
int i,ClustID;
double MinDist,d;
MinDist=9.9e+99;
ClustID=-1;
for(i=0;i<3;i++)
{
d=EucNorm(pat,i);
if(d<MinDist)
{
MinDist=d;
ClustID=i;
}
}
return ClustID;
}
//样本分类
void TForm1::DistributeSamples()
{
int i,pat,Clustid,MemberIndex;
for(i=0;i<3;i++)
ClusterNumMembers[i]=0;
for(pat=0;pat<150;pat++)
{
Clustid=FindClosestCluster(pat);
MemberIndex=ClusterNumMembers[Clustid];
ClusterMember[Clustid][MemberIndex]=pat;
ClusterNumMembers[Clustid]++;
}
}
//重新计算各分类中心
int TForm1::CalcNewClustCenters()
{
int ConvFlag,PatternID,i,j,k;
double Tmp[4];
ConvFlag=1;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
Tmp[j]=0.0;
for(j=0;j<ClusterNumMembers[i];j++)
{
PatternID=ClusterMember[i][j];
for(k=0;k<4;k++)
Tmp[k]+=Pattern[PatternID][k];
}
for(j=0;j<4;j++)
{
Tmp[j]=Tmp[j]/ClusterNumMembers[i];
if(Tmp[j]!=ClusterCenter[i][j])
{
ConvFlag=0;
ClusterCenter[i][j]=Tmp[j];
}
}
}
return ConvFlag;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -