⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kmean.cpp

📁 神经网络的好程序
💻 CPP
字号:
//#include "stdafx.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <iomanip.h>
#include <iostream.h>
#include <math.h>
#include <fstream.h>
#include <dos.h>
#include <conio.h>



const int   TRUE=1, FALSE=0;
const int   MAXPATTERN=14,MAXVECTDIM=2,MAXCLUSTER=4;

struct aCluster {
   double       Center[MAXVECTDIM];
   int          Member[MAXPATTERN];
   int          NumMembers;
};

class System {
private:
   double       Pattern[MAXPATTERN][MAXVECTDIM];
   aCluster     Cluster[MAXCLUSTER];
   int          NumPatterns;
   int          SizeVector;
   int          NumClusters;
   void         DistributeSamples();
   int          CalcNewClustCenters();
   double       EucNorm(int, int);
   int          FindClosestCluster(int);

public:
   void LoadPatterns();
   void InitClusters();
   void RunKMeans();
   void SaveClusters();
};

void System::LoadPatterns(){
   FILE *InFilePtr;

   int    i,j,k,tmp,Randomsequence[MAXPATTERN];
   
   double x;
if((InFilePtr = fopen("fname.txt", "r")) == NULL)
    return ;
fscanf(InFilePtr, "%d", &NumPatterns);
fscanf(InFilePtr, "%d", &SizeVector);
fscanf(InFilePtr, "%d", &NumClusters);

    srand((unsigned)time(NULL));

	for(i=0;i<NumPatterns;i++)
      Randomsequence[i]=i;
	
      
	for(i=0;i<NumPatterns;i++){
        j=rand()%NumPatterns;
        k=rand()%NumPatterns;
        tmp=Randomsequence[j];
        Randomsequence[j]=Randomsequence[k];
        Randomsequence[k]=tmp;
	  }


for (i=0; i<NumPatterns; i++) {
   for (j=0; j<SizeVector; j++) {
      fscanf(InFilePtr,"%lg",&x);
      Pattern[Randomsequence[i]][j]=x;
      }
   }
}

void System::InitClusters(){
for (int i=0; i<NumClusters; i++) {
   Cluster[i].Member[0]=i;
   for (int j=0; j<SizeVector; j++) {
      Cluster[i].Center[j]=Pattern[i][j];
      }
   }
}

void System::RunKMeans(){
  int converged=FALSE;
while (converged==FALSE) {
   DistributeSamples();
   converged=CalcNewClustCenters();
   }
}

double System::EucNorm(int p, int c){
double dist=0.0;
for(int i=0; i<SizeVector;i++){
  dist+=(Cluster[c].Center[i]-Pattern[p][i])*(Cluster[c].Center[i]-Pattern[p][i]);
   }
return dist;
}


int System::FindClosestCluster(int pat){
   int i, ClustID;
   double MinDist, d;
MinDist =9.9e+99;
ClustID=-1;
for (i=0; i<NumClusters; i++) {
   d=EucNorm(pat,i);
   if (d<MinDist) {
      MinDist=d;
      ClustID=i;
      }
   }
if (ClustID<0) {
   printf("Aaargh");
   exit(0);
   }
return ClustID;
}


void System::DistributeSamples(){
int i,pat,Clustid,MemberIndex;
for (i=0; i<NumClusters;i++){
   Cluster[i].NumMembers=0;
   }
for (pat=0; pat<NumPatterns; pat++) {
   Clustid= FindClosestCluster(pat);
   MemberIndex=Cluster[Clustid].NumMembers;
   Cluster[Clustid].Member[MemberIndex]=pat;
   Cluster[Clustid].NumMembers++;
   }
}


int  System::CalcNewClustCenters(){
   int    ConvFlag,VectID,i,j,k;
   double tmp[MAXVECTDIM];
   ConvFlag=TRUE;
for (i=0; i<NumClusters; i++) {
  for (j=0; j<SizeVector; j++)
    tmp[j]=0.0;

   for (j=0; j<Cluster[i].NumMembers; j++) {
      VectID=Cluster[i].Member[j];
      for (k=0; k<SizeVector; k++)
         tmp[k]+= Pattern[VectID][k];
            }

   double temp1=0.0;
   for (k=0; k<SizeVector; k++) {
      tmp[k]=tmp[k]/Cluster[i].NumMembers;
      temp1+=(tmp[k]-Cluster[i].Center[k])*(tmp[k]-Cluster[i].Center[k]);
      }
   temp1=sqrt(temp1);

   for (k=0; k<SizeVector; k++)
        Cluster[i].Center[k]=tmp[k];
    
   if (temp1>0.0000001)
       ConvFlag=FALSE;
   }
return ConvFlag;
}


void System::SaveClusters(){
 
  int i,j,k,VectID; 
	ofstream fout;
    fout.open("123.txt",ios::app|ios::out);

  for(i=0;i<NumClusters;i++)
    {
     fout<<endl;
/* 
//     fout<<setw(11)<<setiosflags(ios::right)<<"Center:  ";

//     fout<<setw(7)<<setiosflags(ios::right)<<Cluster[i].Center[0];

//	 for (j=1;j<SizeVector;j++)
//       fout<<setw(12)<<setiosflags(ios::right)<<Cluster[i].Center[j];
//     fout<<endl;
*/
     fout<<setw(11)<<setiosflags(ios::right)<<"Pattern:  ";

      VectID=Cluster[i].Member[0];
      fout<<setw(7)<<setiosflags(ios::right)<<Pattern[VectID][0];
     
	  for (k=1; k<SizeVector; k++)
        fout<<setw(12)<<setiosflags(ios::right)<<Pattern[VectID][k];
      fout<<endl;

	 for (j=1; j<Cluster[i].NumMembers; j++) {
      VectID=Cluster[i].Member[j];

      fout<<setw(18)<<setiosflags(ios::right)<<Pattern[VectID][0];
     
	  for (k=1; k<SizeVector; k++)
        fout<<setw(12)<<setiosflags(ios::right)<<Pattern[VectID][k];
      fout<<endl;
	}
    
   	  double x4=0.0;

	  for (j=0; j<Cluster[i].NumMembers; j++){
        VectID=Cluster[i].Member[j];
	
		for (k=0; k<SizeVector; k++)
          x4+=(Pattern[VectID][k]-Cluster[i].Center[k])
			  *(Pattern[VectID][k]-Cluster[i].Center[k]); 
	  }
/*
//	    fout<<setw(10)<<setiosflags(ios::right)<<"Radii:";		
//	    fout<<setw(8)<<setiosflags(ios::right)<<x4/Cluster[i].NumMembers<<endl;		

  */
  
 
     fout<<setw(11)<<setiosflags(ios::right)<<"Center:  ";

     fout<<setw(7)<<setiosflags(ios::right)<<Cluster[i].Center[0];

	 for (j=1;j<SizeVector;j++)
       fout<<setw(12)<<setiosflags(ios::right)<<Cluster[i].Center[j];
     fout<<endl;
	  
	  
	  
//	  fout<<setw(10)<<setiosflags(ios::right)<<"Clu.Num:";		
//	    fout<<setw(8)<<setiosflags(ios::right)<<Cluster[i].NumMembers<<endl;		

  
  
  }

      fout<<"///////////////////////////"<<endl;
      fout.close();
}


void main(void) {

   System kmeans;
   kmeans.LoadPatterns();
   kmeans.InitClusters();
   kmeans.RunKMeans();
   kmeans.SaveClusters();
}












	








⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -