📄 ckmedoids.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 + -