[置顶] 聚类算法-最大最小距离算法(实例+代码)
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 end2.实例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"; }
如果你觉得该帖子帮到你,还望贵人多多支持,鄙人会再接再厉,继续努力的~
相关文章推荐
- 聚类算法——最大最小距离算法
- 几种聚类算法的结合运用(K-MEANS K-medoids 最大最小距离算法)
- 聚类算法——最大最小距离算法(python实现)
- JAVA得到数组中最大值和最小值的简单实例
- 求最大公约数与最小公倍数实例C++程序代码
- 实例13. 库存补充操作——最小-最大计划(Min-Max Planning)
- [置顶] Spring Integration实例代码分析之basic--http
- 求PHP数组最大值,最小值的代码
- [置顶] 基于最大最小距离的分类数目上限K确定的聚类方法
- java代码数组求平均值,最大值,最小值
- 最大流/最小割(maxflow/mincut)的原理讲解和代码实现
- java代码--实现随机输出10个随机数,并显示最大值,最小值
- 求最大公约数与最小公倍数实例C++程序代码
- 编程之美2.10寻找数组中的最大值和最小值代码
- mapreduce编程实例(2)-求最大值和最小值
- 最小生成树C代码实例
- ZOJ 1952( Dijkstra )要求卡车的最大载货量,即是求dist[]的最小值这里关键是把字符串转化为数字存储在邻接矩阵cost[][]中.开始看了党姐的代码不懂,又看了一遍,大悟!
- Java求最大值,Java求最小值,含实例截图
- 1)复选框中文字在左边;2)水平滚动条最小值为4、最大值为72;且在窗体Load事件中通过代码设置;3)单击任何复选框,标签上文字样式都发生变化;4)单击任意单选按钮,标签上文字字体都发生改变;5)拖
- JS获取月的最后一天与JS得到一个月份最大天数的实例代码