聚类算法之简单聚类算法(C++)

来源:互联网 发布:上海数据港上市时间 编辑:程序博客网 时间:2024/05/25 23:27

SimpleClassify.cpp:

 

 

[cpp:firstline[1]] view plaincopy
  1. /** 
  2. * @author bianzhiqi 200732580077 
  3. * @date 2009-10-28 
  4. */  
  5.   
  6. #include <cstdlib>  
  7. #include <iostream>  
  8. #include <math.h>   
  9. #include "destances.h"  
  10. using namespace std;  
  11. const int M=5;//模式集中向量的个数  
  12. const int N=4;//向量中元素的个数   
  13. double T;  
  14. struct classNode{  
  15.        double x[N];  
  16.        classNode* next;  
  17.        };   
  18. classNode classes[M];//存储聚类中心  
  19. int n=0;//记录聚类中心的个数   
  20. //对单个向量聚类操作   
  21. void classify(double x[]){  
  22.      double min=T;  
  23.      int minNum=-1;  
  24.      for(int i=0;i<n;i++){  
  25.          double y[N];  
  26.          for(int j=0;j<N;j++)  
  27.             y[j]=classes[i].x[j];  
  28.          double dest=getEuclidean(x,y,N);  
  29.          if(dest<=T){  
  30.              //找到最小的欧氏距离,并记录下对应聚类中心所在的单元   
  31.              if(dest<=min){  
  32.                  min=dest;   
  33.                  minNum=i;  
  34.                  }  
  35.              }  
  36.          }  
  37.      //minNum被改变,   
  38.      if(minNum!=-1){  
  39.          classNode* temp;  
  40.          for(int i=0;i<N;i++)  
  41.              temp->x[i]=x[i];  
  42.          temp->next=classes[minNum].next;  
  43.          classes[minNum].next=temp;  
  44.          return;  
  45.          }  
  46.      classNode cls;  
  47.      for(int i=0;i<N;i++)  
  48.          cls.x[i]=x[i];  
  49.      cls.next=NULL;  
  50.      classes[n]=cls;  
  51.      n++;  
  52.      return;  
  53.      }  
  54. //对整个矢量集进行聚类操作   
  55. void AsemClassify(double x[M][N]){  
  56.      for(int i=0;i<M;i++){  
  57.          double array[N];  
  58.            
  59.          if(i==0){  
  60.              classNode cls;  
  61.              for(int i=0;i<N;i++)  
  62.                  cls.x[i]=x[0][i];  
  63.              cls.next=NULL;  
  64.              classes[0]=cls;  
  65.              n++;  
  66.             }  
  67.          else{  
  68.               for(int j=0;j<N;j++)  
  69.                   array[j]=x[i][j];  
  70.               classify(array);  
  71.               }  
  72.          }  
  73.      }  
  74.   
  75. //遍历链表,得到聚类结果  
  76. void getResult(){  
  77.      for(int i=0;i<n;i++){  
  78.          cout<<"Class "<<i+1<<" : "<<endl;  
  79.          for(int j=0;j<N;j++)  
  80.              cout<<classes[i].x[j]<<" ";  
  81.          cout<<endl;  
  82.            
  83.          classNode* temp;  
  84.          temp=classes[i].next;  
  85.          if(temp){  
  86.              for(int j=0;j<N;j++)   
  87.                  cout<<temp->x[j]<<" ";  
  88.              cout<<endl;  
  89.              temp=temp->next;  
  90.          }  
  91.      }  
  92. }   
  93.   
  94. int main(int argc, char *argv[]){  
  95.      double all[M][N];  
  96.      cout<<"请输入"<<M<<"*"<<N<<"的数组:"<<endl;  
  97.      for(int i=0;i<M;i++)  
  98.          for(int j=0;j<N;j++)  
  99.              cin>>all[i][j];  
  100.       AsemClassify(all);  
  101.       getResult();  
  102. }  

 

distances.cpp:

[cpp:firstline[1]] view plaincopy
  1. /** 
  2. * @author bianzhiqi 200732580077 
  3. * @date 2009-10-15 
  4. */  
  5.   
  6. #include <cstdlib>  
  7. #include <iostream>  
  8. #include <math.h>   
  9. #include "Matrix.h"  
  10. using namespace std;  
  11.   
  12. //欧氏距离   
  13. double getEuclidean(double x[], double y[], int n)  
  14. {  
  15.        double euclidean=0;  
  16.        for(int i=0;i<n;i++)                  
  17.        {  
  18.            euclidean+=(x[i]-y[i])*(x[i]-y[i]);  
  19.        }  
  20.        euclidean=sqrt(euclidean);  
  21.        return euclidean;  
  22. }  
  23.   
  24. //绝对值距离  
  25. double getManhattan(double x[], double y[], int n)  
  26. {  
  27.        double manhattan=0;  
  28.        for(int i=0;i<n;i++)  
  29.        {  
  30.            manhattan+=fabs(x[i]-y[i]);  
  31.        }  
  32.        return manhattan;  
  33. }   
  34.   
  35. //切氏距离  
  36. double getChebyshev(double x[], double y[], int n)  
  37. {  
  38.        double chebyshev=0;  
  39.        for(int i=0;i<n;i++)  
  40.        {  
  41.            double temp;  
  42.            temp=fabs(x[i]-y[i]);  
  43.            if(temp>chebyshev) chebyshev=temp;  
  44.        }  
  45.        return chebyshev;  
  46. }   
  47.   
  48. //明氏距离   
  49. double getMinkowski(double x[], double y[], int n,int m)  
  50. {  
  51.        double minkowski=0;  
  52.        for(int i=0;i<n;i++)  
  53.        {  
  54.            double temp=1;  
  55.            for(int j=0;j<m;j++)  
  56.            {  
  57.                temp=temp*fabs(x[i]-y[i]);  
  58.            }  
  59.            minkowski+=temp;  
  60.        }   
  61.        minkowski=pow(minkowski,1/m);  
  62.        return minkowski;  
  63. }  
  64.   
  65. //Camberra距离  
  66. double getCamberra(double x[], double y[], int n)  
  67. {  
  68.        double camberra=0;  
  69.        for(int i=0;i<n;i++)  
  70.        {  
  71.                camberra+=(x[i]-y[i])/(x[i]+y[i]);  
  72.        }  
  73.        camberra=fabs(camberra);  
  74.        return camberra;  
  75. }   

 

原创粉丝点击