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

来源:互联网 发布:热力地图制作软件 编辑:程序博客网 时间:2024/05/19 13:57

样本: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 Centersint sum;//The number of Patternbool isCenter[MAXN];//save Cluster Centerstypedef 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();}

且并不太可能找时间优化他


阅读全文
0 0
原创粉丝点击