您的位置:首页 > 其它

生成聚类中心:最大最小距离算法

2017-06-24 09:20 916 查看
样本:x0(0 0), x1(3 8), x2(2 2), x3(1 1), x4(5 3), x5(4 8), x6(6 3), x7(5 4), x8(6 4), x9(7 5)



一个粗糙的最大最小距离算法代码#include <bits/stdc++.h>
using namespace std;
const double INF=9999999999999;
const int MAXN=1e6+10;
double D;//Distance limit between different Cluster Centers
int sum;//The number of Pattern
bool isCenter[MAXN];//save Cluster Centers
typedef struct Pattern{
double x,y;
int id;
}Pattern;
Pattern node[MAXN];
typedef struct Clusters{
vector <Pattern> Cluster_Center;
vector <int> Cluster[MAXN];
public:
bool empty(){
return Cluster_Center.empty()?1:0;
}
void push(Pattern x){
Cluster_Center.push_back(x);
return ;
}
double dis(Pattern x){
double mindis=INF,tempdis;
int len=Cluster_Center.size();
for(int i=0;i<len;i++){
tempdis=sqrt((x.x-Cluster_Center[i].x)*(x.x-Cluster_Center[i].x)+(x.y-Cluster_Center[i].y)*(x.y-Cluster_Center[i].y));
mindis=min(mindis,tempdis);
}
return mindis;
}
void showCenter(){
int len=Cluster_Center.size();
cout<<"计算聚类中心完毕,展示所有聚类中心:"<<endl;
for(int i=0;i<len;i++){
cout<<'x'<<Cluster_Center[i].id<<' '<<Cluster_Center[i].x<<' '<<Cluster_Center[i].y<<endl;
}
}
void order(Pattern a[]){
int len=Cluster_Center.size();
for(int i=0;i<len;i++){
Cluster[i].push_back(Cluster_Center[i].id);
}
for(int i=0;i<sum;i++){
if(!isCenter[i]){
double tempdis,minndis=INF;
int belong=-1;
for(int j=0;j<len;j++){
tempdis=sqrt((a[i].x-Cluster_Center[j].x)*(a[i].x-Cluster_Center[j].x)+(a[i].y-Cluster_Center[j].y)*(a[i].y-Cluster_Center[j].y));
if(tempdis<minndis){
minndis=tempdis;
belong=j;
}
}
Cluster[belong].push_back(i);
}
}
}
void showCluster(){
int len=Cluster_Center.size();
cout<<"计算聚类,展示所有聚类:"<<endl;
for(int i=0;i<len;i++){
int llen=Cluster[i].size();
cout<<"第"<<i<<"类样本集为:"<<endl;
for(int j=0;j<llen;j++){
cout<<'x'<<Cluster[i][j]<<' ';
}
cout<<endl;
}

}
}Clusters;

Clusters clu;
void ini(){
memset(isCenter,0,sizeof(isCenter));
node[0]={0,0,0};node[1]={3,8,1};node[2]={2,2,2};node[3]={1,1,3};node[4]={4,2,4};node[5]={4,8,5};node[6]={6,3,6};node[7]={5,4,7};node[8]={6,4,8};node[9]={7,5,9};
D=3;
sum=10;
clu.Cluster_Center.clear();
}
bool Find_Cluster_Center(){
if(clu.empty()){
isCenter[0]=1;
clu.push(node[0]);
}else{
double tempdis;
double maxndis=-INF;
int newCenter=-1;
for(int i=0;i<sum;i++){
if(!isCenter[i]){
tempdis=clu.dis(node[i]);
if(tempdis>maxndis){
newCenter=i;
maxndis=tempdis;
}
}

}
if(maxndis<D) return 0;
isCenter[newCenter]=1;
clu.push(node[newCenter]);
}
return 1;
}
int main()
{
ini();
while(1){
if(!Find_Cluster_Center()) break;
}
clu.showCenter();
clu.order(node);
clu.showCluster();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: