📄 main.cpp
字号:
/*********************************************************
// 模糊C均值聚类算法
// Coded by zhchshen
// Date: 2008-08-19 23:42
// zhchshen@yahoo.com.cn
// Bezdek J C. Pattern Recognition with Fuzzy Objective
// Function Algorithms. New York:Plenum Press, 1981
// 编译环境: VC++ 6.0
**********************************************************/
#include "data.h"
#include "func.h"
#include "max.h"
//全局变量定义
double **Data; //数据矩阵
double **Center; //聚类中心矩阵
double **U; //样本隶属度矩阵
int m; //样本总数
int n; //样本属性数
int k; //设定的划分类别数
int main()
{
int Lab; //数据文件标号
int num; //算法运行次数
///////////////////////////////////////////////////////////////
cout<<"模糊C均值聚类算法:"<<endl;
cout<<"1-iris.txt; 2-wine.txt; 3-ASD_12_2.txt; 4-ASD_14_2.txt"<<endl;
cout<<"请选择数据集: Lab=";
cin>>Lab;
cout<<"设定运行次数: mum=";
cin>>num;
//各次运行结束后的目标函数
double* Index=new double[num];
//各次运行结束后的聚类正确率
double* R=new double [num];
//num次运行的平均目标函数及平均正确率
double M_Index=0;
double M_R=0;
//FCM聚类算法运行num次,并保存记录与结果
for(int i=0;i<num;i++)
{
int j;
double epsilon=1e-4;
int e=0;
int nx=0;
//记录连续无改进次数
int E[200]={0};
if(i>0)
{
cout<<endl<<endl;
cout<<setfill('#')<<setw(10)<<endl;
}
cout<<"第"<<i+1<<"次运行记录:"<<endl;
//读取数据文件
if(Lab==1)
{
m=150;
n=4;
k=3;
Data=DataRead("dataset\\iris.txt",m,n);
}
else if(Lab==2)
{
m=178;
n=13;
k=3;
Data=DataRead("dataset\\wine.txt",m,n);
}
else if(Lab==3)
{
m=535;
n=2;
k=12;
Data=DataRead("dataset\\ASD_12_2.txt",m,n);
}
else if(Lab==4)
{
m=685;
n=2;
k=14;
Data=DataRead("dataset\\ASD_14_2.txt",m,n);
}
//数据极差标准化处理
Data=Standardize(Data,m,n);
//聚类中心及隶属度矩阵,内存分配
Center=new double*[k];
U=new double *[k];
for(j=0;j<k;j++)
{
Center[j]=new double[n];
U[j]=new double[m];
}
//隶属度矩阵的初始化
Initialize(U, k, m);
//对隶属度矩阵进行归一化
Normalize(U,k,m);
//历次迭代过程中的目标函数
double Objfcn[100]={0};
cout<<"第"<<i+1<<"次运行记录:"<<endl;
cout<<"开始迭代过程!"<<endl;
cout<<"*******************************"<<endl;
//输出精度为小数点后5位
cout.precision(5);
//固定格式
cout.setf(ios::fixed);
//目标函数连续20代无改进,停止该次聚类迭代过程
while(e<20)
{
nx++;
//聚类迭代过程
Objfcn[nx]=Update(U,Data,Center,m,n,k);
//统计目标函数连续无改进次数e
if(nx>0 && Objfcn[nx]-Objfcn[nx-1]<epsilon )
{
e++;
}
else
{
e=0;
}
E[nx]=e;
}
//输出结果到文件,保存
ofstream outfile("运行记录.txt",ios::app);
outfile<<"第"<<i+1<<"次运行记录:"<<endl;
outfile<<"开始迭代过程!"<<endl;
outfile<<"*******************************"<<endl;
outfile.precision(5);
outfile.setf(ios::fixed);
for(int n1=1;n1<=nx;n1++)
{
cout<<"e["<<setw(2)<<n1<<"]="<<setw(2)<<E[n1]<<" Objfcn["
<<setw(2)<<n1<<"]="<<Objfcn[n1]<<" \n";
//保存数据文件
outfile<<"e["<<setw(2)<<n1<<"]="<<setw(2)<<E[n1]<<" Objfcn["
<<setw(2)<<n1<<"]="<<Objfcn[n1]<<" \n";
}
cout<<endl;
outfile<<endl;
outfile.close();
//本次运行的最大目标函数
Index[i]=Objfcn[nx];
//保存聚类正确率,输出聚类结果:
R[i]=Result(Lab, U, k, m, i);
//内存释放
for(j=0;j<k;j++)
{
delete[]Center[j];
delete[]U[j];
}
delete[]Center;
delete[]U;
}
//////////////////////////统计平均///////////////////////////////////
double temp1=0, temp2=0;
for(i=0;i<num;i++)
{
temp1+=Index[i];
temp2+=R[i];
}
//计算各次结果的统计平均
M_Index=(double)temp1/num;
M_R=(double)temp2/num;
cout<<"//////////////////////////////////////////////////////////////"<<endl;
cout<<num<<"次运行,平均聚类正确率: "<<100*M_R<<"%"<<endl;
//输出精度为小数点后6位
cout.precision(6);
//固定格式
cout.setf(ios::fixed);
cout<<"平均目标函数: "<<M_Index<<endl;
//统计结果文件保存
ofstream resultfile("聚类结果.txt",ios::app);
resultfile<<"//////////////////////////////////////////////////////////////"<<endl;
resultfile<<num<<"次运行,平均聚类正确率: "<<100*M_R<<"%"<<endl;
//输出精度为小数点后6位
resultfile.precision(6);
//固定格式
resultfile.setf(ios::fixed);
resultfile<<"平均目标函数: "<<M_Index<<endl;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -