?? main.cpp
字號(hào):
/*********************************************************
// 模糊C均值聚類(lèi)算法
// 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
// 編譯環(huán)境: VC++ 6.0
**********************************************************/
#include "data.h"
#include "func.h"
#include "max.h"
//全局變量定義
double **Data; //數(shù)據(jù)矩陣
double **Center; //聚類(lèi)中心矩陣
double **U; //樣本隸屬度矩陣
int m; //樣本總數(shù)
int n; //樣本屬性數(shù)
int k; //設(shè)定的劃分類(lèi)別數(shù)
int main()
{
int Lab; //數(shù)據(jù)文件標(biāo)號(hào)
int num; //算法運(yùn)行次數(shù)
///////////////////////////////////////////////////////////////
cout<<"模糊C均值聚類(lèi)算法:"<<endl;
cout<<"1-iris.txt; 2-wine.txt; 3-ASD_12_2.txt; 4-ASD_14_2.txt"<<endl;
cout<<"請(qǐng)選擇數(shù)據(jù)集: Lab=";
cin>>Lab;
cout<<"設(shè)定運(yùn)行次數(shù): mum=";
cin>>num;
//各次運(yùn)行結(jié)束后的目標(biāo)函數(shù)
double* Index=new double[num];
//各次運(yùn)行結(jié)束后的聚類(lèi)正確率
double* R=new double [num];
//num次運(yùn)行的平均目標(biāo)函數(shù)及平均正確率
double M_Index=0;
double M_R=0;
//FCM聚類(lèi)算法運(yùn)行num次,并保存記錄與結(jié)果
for(int i=0;i<num;i++)
{
int j;
double epsilon=1e-4;
int e=0;
int nx=0;
//記錄連續(xù)無(wú)改進(jìn)次數(shù)
int E[200]={0};
if(i>0)
{
cout<<endl<<endl;
cout<<setfill('#')<<setw(10)<<endl;
}
cout<<"第"<<i+1<<"次運(yùn)行記錄:"<<endl;
//讀取數(shù)據(jù)文件
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);
}
//數(shù)據(jù)極差標(biāo)準(zhǔn)化處理
Data=Standardize(Data,m,n);
//聚類(lèi)中心及隸屬度矩陣,內(nèi)存分配
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);
//對(duì)隸屬度矩陣進(jìn)行歸一化
Normalize(U,k,m);
//歷次迭代過(guò)程中的目標(biāo)函數(shù)
double Objfcn[100]={0};
cout<<"第"<<i+1<<"次運(yùn)行記錄:"<<endl;
cout<<"開(kāi)始迭代過(guò)程!"<<endl;
cout<<"*******************************"<<endl;
//輸出精度為小數(shù)點(diǎn)后5位
cout.precision(5);
//固定格式
cout.setf(ios::fixed);
//目標(biāo)函數(shù)連續(xù)20代無(wú)改進(jìn),停止該次聚類(lèi)迭代過(guò)程
while(e<20)
{
nx++;
//聚類(lèi)迭代過(guò)程
Objfcn[nx]=Update(U,Data,Center,m,n,k);
//統(tǒng)計(jì)目標(biāo)函數(shù)連續(xù)無(wú)改進(jìn)次數(shù)e
if(nx>0 && Objfcn[nx]-Objfcn[nx-1]<epsilon )
{
e++;
}
else
{
e=0;
}
E[nx]=e;
}
//輸出結(jié)果到文件,保存
ofstream outfile("運(yùn)行記錄.txt",ios::app);
outfile<<"第"<<i+1<<"次運(yùn)行記錄:"<<endl;
outfile<<"開(kāi)始迭代過(guò)程!"<<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";
//保存數(shù)據(jù)文件
outfile<<"e["<<setw(2)<<n1<<"]="<<setw(2)<<E[n1]<<" Objfcn["
<<setw(2)<<n1<<"]="<<Objfcn[n1]<<" \n";
}
cout<<endl;
outfile<<endl;
outfile.close();
//本次運(yùn)行的最大目標(biāo)函數(shù)
Index[i]=Objfcn[nx];
//保存聚類(lèi)正確率,輸出聚類(lèi)結(jié)果:
R[i]=Result(Lab, U, k, m, i);
//內(nèi)存釋放
for(j=0;j<k;j++)
{
delete[]Center[j];
delete[]U[j];
}
delete[]Center;
delete[]U;
}
//////////////////////////統(tǒng)計(jì)平均///////////////////////////////////
double temp1=0, temp2=0;
for(i=0;i<num;i++)
{
temp1+=Index[i];
temp2+=R[i];
}
//計(jì)算各次結(jié)果的統(tǒng)計(jì)平均
M_Index=(double)temp1/num;
M_R=(double)temp2/num;
cout<<"//////////////////////////////////////////////////////////////"<<endl;
cout<<num<<"次運(yùn)行,平均聚類(lèi)正確率: "<<100*M_R<<"%"<<endl;
//輸出精度為小數(shù)點(diǎn)后6位
cout.precision(6);
//固定格式
cout.setf(ios::fixed);
cout<<"平均目標(biāo)函數(shù): "<<M_Index<<endl;
//統(tǒng)計(jì)結(jié)果文件保存
ofstream resultfile("聚類(lèi)結(jié)果.txt",ios::app);
resultfile<<"//////////////////////////////////////////////////////////////"<<endl;
resultfile<<num<<"次運(yùn)行,平均聚類(lèi)正確率: "<<100*M_R<<"%"<<endl;
//輸出精度為小數(shù)點(diǎn)后6位
resultfile.precision(6);
//固定格式
resultfile.setf(ios::fixed);
resultfile<<"平均目標(biāo)函數(shù): "<<M_Index<<endl;
return 0;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -