?? 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 + -