**
实验一 最大最小距离法
**
一.实验目的
本实验的目的是使学生了解最大最小距离法聚类方法,掌握最大最小距离聚类分析法的基本原理,培养学生实际动手和思考能力,为数据分析和处理打下牢固基础。
二.最大最小距离聚类算法
该算法以欧氏距离为基础,首先辨识最远的聚类中心,然后确定其他的聚类中心,直到无新的聚类中心产生。最后将样本按最小距离原则归入最近的类。
例:样本分布如图所示。
样本
第一分量 0 3 2 1 5 4 6 5 6 7
第二分量 0 8 2 1 3 8 3 4 4 5
到的距离 0
到的距离 0
0 0
最大最小距离聚类算法步骤如下:
① 给定,,并且任取一个样本作为第一个聚合中心,。
② 寻找新的集合中心:
计算其它所有样本到的距离:
若,则取为第二个聚合中心,。
计算所有样本到和的距离和:
若,,并且,为和间距离,则取为第三个集合中心,。【注意:,】
如果存在,则计算,,若,则建立第四个聚合中心。依次类推,直到最大最小距离不大于时,结束寻找聚合中心的计算。
注意所在第列,在中为最大的,而且,一般取。所以,。
这里的例中只有三个集合中心,,,。
③ 按最近邻原则把所有样本归属于距离最近的聚合中心,得: ,,。
④ 按照某聚类准则考查聚类结果,若不满意,则重选,第一个聚合中心,返回到②,直到满意,算法结束。
该算法的聚类结果与参数和起始点的选取关系重大。若无先验样本分布知识,则只有用试探法通过多次试探优化,若有先验知识用于指导和选取,则算法可很快收敛。
三.实验内容
见右图所示,为二维点集。
四.实验步骤
1、提取分类特征,确定特征值值域,确定特征空间;
2、编写聚类程序;
3、将所提取的样本的加以聚类;
4、用误差平方和准则(也可选用其他准则)加以评价,直到满意为止。
#include <iostream>
#include <math.h>
using namespace std;
const int N=10;//给定N个样本
int maxmindistance(float sample[][N],float theta)
{
int center[20];//保存聚类中心
float D[20][N];//保存D点与点之间的距离
float min[N];
int minindex[N];
int clas[N];
float theshold;
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=(sample[0][j]-sample[0][0])*(sample[0][j]-sample[0][0])+(sample[1][j]-sample[1][0])*(sample[1][j]-sample[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=(sample[0][j]-sample[0][center[k]])*(sample[0][j]-sample[0][center[k]])+
(sample[1][j]-sample[1][center[k]])*(sample[1][j]-sample[1][center[k]]);
D[k][j]=(float)sqrt(tmp);
}
for(j=0;j<N;j++)
{
float tmp=D12; //8.944
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<<sample[i][j]<<" ";
cout<<"\n";
}
cout<<"k="<<k+1<<" ";
cout<<"center(sample):";
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";
return k;
}
#include"maxmindistance.h"
int main()
{
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 theta;
cin>>theta;
maxmindistance(s,theta);
}