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

📄 ckmedoids.cpp

📁 K-mean算法
💻 CPP
字号:
// ***************************************************************
//  Ckmedoids   version:  1.0   ? date: 08/22/2007
//  -------------------------------------------------------------
//  采用K-中心点算法对IRIS 训练数据和测试数据进行聚类分析
//  -------------------------------------------------------------
//  Copyright (C) 2007 - All Rights Reserved
// ***************************************************************
// 
// ***************************************************************

#include <iostream.h>
#include <math.h>
#include <stdio.h>
 const N = 75;
int Min_Index(double A[],int len)
{
	double temp=0;
	int index=0;
	temp=A[0];
	for (int i=1;i<len;i++)
	{
		if (A[i]<temp)
		{
			temp = A[i];
			index = i;
		}

	}
	return index;
}

void NewMean(int k,int len,double InitData[],int TypeId[],double MeanCenter[])
{
	//计算新的中心点

	double sum = 0,temp = 0;
	int num = 0,index = 0;
	for (int i=0;i<k;i++)
	{
		for (int j=0;j<len;j++)
		{
			if (TypeId[j]==i)
			{
				sum+=InitData[j];
				num++;
			}		
		}
		MeanCenter[i]=(double)(sum/num);
		sum=0;
		num=0;
	}

	for(i=0;i<k;i++)  //选择离中心最近的点作为新的类中心,
	{
		temp = MeanCenter[i];
		for (int j=0;j<len;j++)
		{
			if ((TypeId[j]==i)&&(fabs(InitData[j]-MeanCenter[i])<temp))
			{
				index=j;
			}		
		}
		MeanCenter[i]=InitData[index];
	}
}

void ReadFile(char * FileName,double A[75][4],float ID[75][3])
{
	FILE *fp;
	if((fp=fopen("IRIS training data.txt","r"))==NULL)
	{ 
		 printf("Cannot open file strike any key exit!");
	}

	for(int i=0;i<N;i++)
	{	
		fscanf(fp,"%lf %lf %lf %lf %f %f %f",&A[i][0],&A[i][1],&A[i][2],&A[i][3],&ID[i][0],&ID[i][1],&ID[i][2]);
			
	}

	fclose(fp);

}

void Process(char * FileName)
{
		
	double OldMinMean=0,NewMinMean=0;
	float ID[N][3];
	double MeanCenter[N];//存储类中心点
	double data[N][4];//存储数据库中的数据
	double InitData[N];
	double d[N];	//距离
	double Decision;//决策变量
	int    TypeID[N];//分类结果
	int    k=0;//中间变量

	ReadFile(FileName,data,ID);
	for(int i=0;i<N;i++)
	{
		d[i]=0;
		TypeID[i]=0;
	}
	
	double temp=0;
	for(i=0;i<N;i++)
	{
		for(int j =0;j<4;j++)
		{
			temp+=data[i][j];
		}
			InitData[i]=temp;
			temp=0;
	}
	
	k = 3;
	
	for (i=0;i<k;i++)
	{		
		MeanCenter[i]=InitData[i];
	}
	do 
	{
		OldMinMean = MeanCenter[Min_Index(MeanCenter,k)];
		for (i=0;i<N;i++)
		{
			for (int j=0;j<k;j++)
			{
				d[j]=fabs(InitData[i]-MeanCenter[j]);
			}
			TypeID[i]=Min_Index(d,k);
		}

		NewMean(k,N,InitData,TypeID,MeanCenter);
		NewMinMean = MeanCenter[Min_Index(MeanCenter,k)];
		Decision = fabs(OldMinMean-NewMinMean);

	}while(Decision>0.00000001);

	cout<<"聚类结果为:"<<endl;

	for (i=0;i<N;i++)
	{	
		if((i%10 == 0)&&(i>0))		
			cout<<endl;
		
		cout<<TypeID[i]<<",";
		
	}

	cout<<endl;
	cout<<"正确结果为:"<<endl;
	int count = 0;
	int right[N];

		for (i=0;i<N;i++)
	{	
			right[i] = 0;
		if((i%10 == 0)&&(i>0))		
			cout<<endl;
		for (int j = 0;j<3;j++)
		{
			if (ID[i][j] == 1)
			{
			cout<<j<<",";
			if (j == TypeID[i])
			{
				right[i] = 1;
				count ++;
			}
			break;
			}
		}
		
	}
	
	cout<<endl<<endl;
    cout<<"聚类对比结果(0:错误,1:正确):"<<endl;
	for (i=0;i<N;i++)
	{
		cout<<right[i]<<",";
			if((i%10 == 9)&&(i>0))		
			cout<<endl;		
	}
	cout<<endl;
	cout<<"正确数: "<<count<<endl;
	cout<<"对数据文件"<<FileName<<"的识别率为: "<<100.0*count/N<<" %"<<endl<<endl;

}

void main()
{
	char * FileName;
   FileName = "IRIS training data.txt";
   Process(FileName);
   FileName = "IRIS testing data.txt";
   Process(FileName);
}

⌨️ 快捷键说明

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