您的位置:首页 > 编程语言

[置顶] 聚类算法-最大最小距离算法(实例+代码)

2016-12-17 17:35 1761 查看

聚类算法-最大最小距离算法(实例+代码)

    【尊重原创,转载请注明出处】http://blog.csdn.net/guyuealian/article/details/53708042

一、最大最小距离算法基本思想

     最大最小距离法是模式识别中一种基于试探的类聚算法,它以欧式距离为基础,取尽可能远的对象作为聚类中心。因此可以避免K-means法初值选取时可能出现的聚类种子过于临近的情况,它不仅能智能确定初试聚类种子的个数,而且提高了划分初试数据集的效率。
    该算法以欧氏距离为基础,首先初始一个样本对象作为第1个聚类中心,再选择一个与第1个聚类中心最远的样本作为第2个聚类中心,然后确定其他的聚类中心,直到无新的聚类中心产生。最后将样本按最小距离原则归入最近的类。

二、算法实现步骤

     假设有10个模式样本点:{x1(0 0), x2(3 8), x3(2 2), x4(1 1), x5(5 3), x6(4 8), x7(6 3), x8(5 4), x9(6 4), x10(7 5)},其样本分布如图所示:



    最大最小距离聚类算法步骤如下:



    该算法的聚类结果与参数和起始点的选取关系重大。若无先验样本分布知识,则只有用试探法通过多次试探优化,若有先验知识用于指导和选取,则算法可很快收敛。

为了方便看解计算过程,下面以表格的方式列出:


    PS:上面的算法内容都是写在Word文档,然后截图放出来的,需要原版Word文档,留言发给你便是~1.实例Matlab代码:源码下载,可直接运行使用】http://download.csdn.net/detail/guyuealian/9714195 测试代码:test.m
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=MaxMinDisFun(x,0.5)
%%%%%%%%%%%%%%%%%
%函数名称 MaxMinDisFun(x,Theta)
%输入参数:
%           x  : x为n*m的特征样本矩阵,每行为一个样本,每列为样本的特征
%         Theta:即θ,可用试探法取一固定分数,如:1/2
%输出参数:
%       pattern:输出聚类分析后的样本类别
%函数功能 :利用最大最小距离算法聚类样本数据,
%%%%%%%%%%%%%%%%%%%%%
function [pattern]=MaxMinDisFun(x,Theta)
maxDistance=0;
index=1;%相当于指针指示新中心点的位置
k=1;      %中心点计数,也即是类别
center=zeros(size(x));    %保存中心点
patternNum=size(x,1);  %输入的数据数(样本数)
%distance=zeros(patternNum,3);%distance每列表示所有样本到每个聚类中心的距离
minDistance=zeros(patternNum,1);%取较小距离
pattern=(patternNum);%表示类别

center(1,:)=x(1,:);%第一个聚类中心
pattern(1)=1;

for i=2:patternNum
distance(i,1)=sqrt((x(i,:)-center(1,:))*(x(i,:)-center(1,:))');%欧氏距离,与第1个聚类中心的距离
minDistance(i,1)=distance(i,1);
pattern(i)=1;%第一类
if(maxDistance<distance(i,1))
maxDistance=distance(i,1);%与第一个聚类中心的最大距离
index=i;%与第一个聚类中心距离最大的样本
end
end

k=k+1;
center(k,:)=x(index,:);%把与第一个聚类中心距离最大的样本作为第二 个聚类中心
pattern(index)=2;%第二类
minDistance(index,1)=0;

while 1
for i=2:patternNum
if(minDistance(i,1)~=0)
distance(i,k)=sqrt((x(i,:)-center(k,:))*(x(i,:)-center(k,:))');%与第k个聚类中心的距离
if(minDistance(i,1)>distance(i,k))
minDistance(i,1)=distance(i,k);
pattern(i)=k;
end
end
end
max=0;
for i=2:patternNum
if((max<minDistance(i,1))&minDistance(i,1)~=0) % (x(i,:)~=center(k,:))
max=minDistance(i,1);
index=i;
end
end
if(max>(maxDistance*Theta))
k=k+1;
center(k,:)=x(index,:);
pattern(index)=k;
minDistance(index,1)=0;
else
break;
end
end
2.实例C++代码:   这是网友的C++代码,可以参考一下~娃哈哈哈哈……
// MaxMinDisTest.cpp :
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
const int N=10;
void main(void)
{ int center[20];
float s[2]
={{0,3,2,1,5,4,6,5,6,7},
{0,8,2,1,3,8,3,4,4,5}};
float D[20]
;
float min
;
int minindex
;
int clas
;
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";
}




如果你觉得该帖子帮到你,还望贵人多多支持,鄙人会再接再厉,继续努力的~

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐