实验一 最大最小距离法
一.实验目的
本实验的目的是使学生了解最大最小距离法聚类方法,掌握最大最小距离聚类分析法的基本原理,培养学生实际动手和思考能力,为数据分析和处理打下牢固基础。
二.最大最小距离聚类算法
该算法以欧氏距离为基础,首先辨识最远的聚类中心,然后确定其他的聚类中心,直到无新的聚类中心产生。最后将样本按最小距离原则归入最近的类。
例:样本分布如图所示。
三.实验内容
见右图所示,为二维点集。
四.实验步骤
1、提取分类特征,确定特征值值域,确定特征空间;
2、编写聚类程序;
3、将所提取的样本的加以聚类;
4、用误差平方和准则(也可选用其他准则)加以评价,直到满意为止。
五. 实验代码
c++实现:
#include <iostream>
#include <math.h>
using namespace std;
const int N=10;
int main()
{ int center[20];
float s[2][N]={{0,3,2,1,5,4,6,5,6,7},
{0,8,2,1,3,8,3,4,4,5}};
float D[20][N];
float min[N];
int minindex[N];
int clas[N];
float theshold;
float theta=0.5;
float D12=0.0;
float tmp=0;
int index=0;
center[0]=0;//first center
int i,k=0,j,l;
for(j=0;j<N;j++)
{ tmp=(s[0][j]-s[0][0])*(s[0][j]-s[0][0])+(s[1][j]-s[1][0])*(s[1][j]-s[1][0]);
D[0][j]=(float)sqrt(tmp);
if(D[0][j]>D12) {D12=D[0][j];index=j;}
}
center[1]=index;//second center
k=1;
index=0;
theshold=D12;
while(theshold>theta*D12){
for(j=0;j<N;j++){
tmp=(s[0][j]-s[0][center[k]])*(s[0][j]-s[0][center[k]])+
(s[1][j]-s[1][center[k]])*(s[1][j]-s[1][center[k]]);
D[k][j]=(float)sqrt(tmp);}
for(j=0;j<N;j++){
float tmp=D12;
for(l=0;l<=k;l++)
if (D[l][j]<tmp) {tmp=D[l][j];index=l;};
min[j]=tmp;minindex[j]=index;
}//min-operate
float max=0;index=0;
for(j=0;j<N;j++)
if(min[j]>max) {max=min[j];index=j;}
if (max>theta*D12){k++;center[k]=index;}// add a center
theshold=max;// prepare to loop next time
} //求出所有中心,final array min[] is still useful
for(j=0;j<N;j++) clas[j]=minindex[j];
for(i=0;i<2;i++)
{for(j=0;j<N;j++)
cout<<s[i][j]<<" ";
cout<<"\n";
}
cout<<"k="<<k+1<<" ";
cout<<"center(s):";
for(l=0;l<k;l++) cout<<center[l]+1<<"--";cout<<center[k]+1;
cout<<"\n";
for(j=0;j<N;j++)
cout<<clas[j]+1<<" ";
cout<<"\n";
}