聚类算法——最大最小距离算法
2017-05-26 16:35
375 查看
最近学校新开的一门课——《模式识别》。
课本对算法介绍的截图:
![](https://img-blog.csdn.net/20170526163258212?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzM1OTA5MjU1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170526163310596?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzM1OTA5MjU1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170526163315612?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzM1OTA5MjU1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170526163320978?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzM1OTA5MjU1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
1、看完课本提出的几个问题并做解答:
(1)θ是干嘛用的?
θ * D12来确定每个类的范围,也就是做为循环的一个结束条件。
(2)聚类中心有什么筛选条件?
这个算法里的聚类中心就是相距最远的那几个点。
(3)怎么去确定有几类?
相当于分裂,只要比定的阈值大,那么这一圈就可以分裂。
2、代码:
课本对算法介绍的截图:
1、看完课本提出的几个问题并做解答:
(1)θ是干嘛用的?
θ * D12来确定每个类的范围,也就是做为循环的一个结束条件。
(2)聚类中心有什么筛选条件?
这个算法里的聚类中心就是相距最远的那几个点。
(3)怎么去确定有几类?
相当于分裂,只要比定的阈值大,那么这一圈就可以分裂。
2、代码:
#include <iostream> #include <math.h> using namespace std; const int N=10;//给定N个样本 int maxmindistance(float sample[] ,float theta) { int center[20];//保存聚类中心 float D[20] ;//保存D点与点之间的距离 float min ; int minindex ; int clas ; 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] ={{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); }
相关文章推荐
- [置顶] 聚类算法-最大最小距离算法(实例+代码)
- 聚类算法——最大最小距离算法(python实现)
- 几种聚类算法的结合运用(K-MEANS K-medoids 最大最小距离算法)
- 最大最小距离算法(Max-Min-diatance)
- 生成聚类中心:最大最小距离算法
- 最大公约数和最小公倍数
- 最小子段和,最大子段和,最小正子段和
- 利用excel的数据透视快速分析数据(求每项的最大值、最小值、求和)
- 获取集合的最大元素和最小元素
- 求出全部的正整数对 使他们最大公约数为n,最小公倍数为m
- 随机产生20个[10 , 50]的正整数存到数组中,并求数组中的所有元素最大值、最小值、平均值以及各元素之和,及第二大值。
- python便捷找出最大元素,最小元素
- 不用比较运算,求两个数中的最大数和最小数
- 输入10个整数,将其中最小的数与第一个数对换,把最大的数和最后一个数对换,写三个函数:1.输入10个数,2.进行处理.3输出10个数
- BZOJ-1001 狼抓兔子 (最小割-最大流)平面图转对偶图+SPFA
- arcgis for javascript 添加featurelayer,设置地图最大最小等级
- poj3469 Dual Core CPU(最大点权独立集+最小割+理解)
- 二分图的最小顶点覆盖 和 最大独立集 和 最大团
- 算法导论9.1 最大值和最小值
- 在传统以太网中,为什么要有最小帧长度和最大帧长度的限制?