实验一 最大最小距离法

**

实验一 最大最小距离法

**
一.实验目的
本实验的目的是使学生了解最大最小距离法聚类方法,掌握最大最小距离聚类分析法的基本原理,培养学生实际动手和思考能力,为数据分析和处理打下牢固基础。
二.最大最小距离聚类算法
该算法以欧氏距离为基础,首先辨识最远的聚类中心,然后确定其他的聚类中心,直到无新的聚类中心产生。最后将样本按最小距离原则归入最近的类。
例:样本分布如图所示。
在这里插入图片描述

样本
第一分量 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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值