实验目的
本实验的目的是使学生了解最大最小距离法聚类方法,掌握最大最小距离聚类分析法的基本原理,培养学生实际动手和思考能力,为数据分析和处理打下牢固基础。
聚类算法
该算法以欧氏距离为基础,首先辨识最远的聚类中心,然后确定其他的聚类中心,直到无新的聚类中心产生。最后将样本按最小距离原则归入最近的类。
1.从N个样本集中的任选取一个样本,作为第一个聚类中心z1;
2.选取距离第一个聚类中心z1最远的样本作为第二个聚类中心z2;
3.计算其余样本与z1,z2之间的距离,并求出它们的最小值
dij=∥xi−zj∥,j=1,2
di=min[di1,di2],i=1,2,…N
4.若:(θ 为 选 定 的 比 例 系 数)
dl=imax[min[di1,di2]]>θ∗∥z1−z2∥
则相应的样本xl作为第三个聚类z3,转至下一步继续判断是否存在新的聚类中心,否则转至第六步
5.假设存在k个聚类中心,计算各样本到各个聚类中心的距离dij,并算出
dl=max[min[di1,di2,…,dik]]>θ∗∥z1−z2∥
若成立,则zk=xl,并循环此步骤,继续判断是否有新的聚类中心存在,否则转至第六步
6当判断不再有新的聚类中心存在时,将样本集按最小距离原则分到各类中去,即计算
dij=∥xi−zj∥,j=1,2,…,k,i=1,2,…,N
实验内容
实验步骤
1、提取分类特征,确定特征值值域,确定特征空间;
2、编写聚类程序;
3、将所提取的样本的加以聚类;
4、用误差平方和准则(也可选用其他准则)加以评价,直到满意为止。
实验代码
clear all
clc
x=[0,0; 3,8; 2,2;1,1; 5,3; 4,8; 6,3; 5,4; 6,4; 7,5]
Theta=0.5;
[pattern,centerIndex]=MaxMinDisFun(x,0.5)
%%%%%%%%%%%%%%%%%
%函数名称 MaxMinDisFun(x,Theta)
%输入参数:
% x : x为n*m的特征样本矩阵,每行为一个样本,每列为样本的特征
% Theta:即θ,可用试探法取一固定分数,如:1/2
%输出参数:
% pattern:输出聚类分析后的样本类别
% centerIndex:聚类中心点
%函数功能 :利用最大最小距离算法聚类样本数据,
%%%%%%%%%%%%%%%%%%%%%
function [classes,centerIndex]=MaxMinDisFun(x,Theta)
maxDistance=0;
start=1; %初始选一个中心点
index=start;%相当于指针指示新中心点的位置
k=1; %中心点计数,也即是类别
dataNum=size(x,1); %输入的样本数
centerIndex=zeros(dataNum,1); %保存中心点
distance=zeros(dataNum,1); %表示所有样本到当前聚类中心的距离
minDistance=zeros(dataNum,1); %取较小距离
classes=zeros(dataNum,1); %表示类别
centerIndex(1)=index;%保存第一个聚类中心
classes(:)=k; %初始类别全为k
%%
for i=1:dataNum
distance(i)=sqrt((x(i,:)-x(centerIndex(1),:))*(x(i,:)-x(centerIndex(1),:))');%欧氏距离,与第1个聚类中心的距离
classes(i)=k;%第1类
if(maxDistance<distance(i))
maxDistance=distance(i);%与第一个聚类中心的最大距离
index=i;%与第一个聚类中心距离最大的样本
end
end
%%
minDistance=distance;
% minDistance(index,1)=0;
maxVal=maxDistance;
while(maxVal>(maxDistance*Theta))%判断新的聚类中心是否满足条件
k=k+1;
centerIndex(k)=index;%判断新的聚类中心是否满足条件,若满足则新增聚类中心
for i=1:dataNum
distance(i)=sqrt((x(i,:)-x(centerIndex(k),:))*(x(i,:)-x(centerIndex(k),:))');%与第k个聚类中心的距离
if(minDistance(i)>distance(i))
minDistance(i)=distance(i);
classes(i)=k;%按照当前最近临方式分类,哪个近就分哪个类别
end
end
%查找minDistance中最大值
maxVal=0;
for i=1:dataNum
if((maxVal<minDistance(i)))
maxVal=minDistance(i);
index=i;
end
end
% centerIndex(k+1)=index;%新的聚类中心
aaa=0;
end
end
运行结果
x =
0 0
3 8
2 2
1 1
5 3
4 8
6 3
5 4
6 4
7 5
pattern =
1
2
1
1
3
2
3
3
3
3
centerIndex =
1
6
7
0
0
0
0
0
0
0