📄 mainprocess.cpp
字号:
/* 分类器使用演示的主程序,作者mallat-fans.
读者可参考此程序,使用KNN、LDF、QDF、MQDF、RDA或者SVM分类器。 */
#include "stdlib.h"
#include <iostream>
#include <fstream>
#include <math.h>
#include <time.h>
#include <sys/timeb.h>
using namespace std;
#include "global.h"
int main ()
{
int i, j, k;
int n;
int numClass, numFeature;
DOUBLE mean, right, total, max;
char* trainFileName = "D:/Cpgm/testData/newVowel-train.data";//训练样本
char* testFileName = "D:/Cpgm/testData/newVowel-test.data";//测试样本
struct timeb tp;
struct tm * tm;
int hour, min, sec, msec;
long time;
//LDF分类器算法
cout<<endl<<"LDF:"<<endl;
CLdf cldf;
cldf.train(trainFileName);
numClass = cldf.sdata.numClass;
numFeature = cldf.sdata.numFeature;
cout<<"类别数:"<<numClass<<endl;
cout<<"特征数:"<<numFeature<<endl;
ftime ( &tp );
tm = localtime (&(tp.time));
hour = tm->tm_hour;
min = tm->tm_min;
sec = tm->tm_sec;
msec = tp.millitm;
cldf.test(testFileName);
ftime ( &tp );
tm = localtime (&(tp.time));
time = (tm->tm_hour-hour)*3600000+(tm->tm_min-min)*60000+(tm->tm_sec-sec)*1000+(tp.millitm-msec);
cout<<"time:"<<time<<" ms"<<endl;
right = 0;
total = 0;
for (i=0; i<numClass; i++)
{
cout<<cldf.sdata.nameClass[i]<<" total:"<<cldf.resultTotal[i]<<" right:"<<cldf.resultRight[i]<<" %:"<<cldf.resultRight[i]*100/cldf.resultTotal[i]<<endl;
right += cldf.resultRight[i];
total += cldf.resultTotal[i];
}
cout<<"mean:"<<100*right/total<<endl;
//QDF分类器算法
cout<<endl<<"QDF:"<<endl;
CQdf cqdf;
cqdf.train(trainFileName);
numClass = cqdf.sdata.numClass;
numFeature = cqdf.sdata.numFeature;
cout<<"类别数:"<<numClass<<endl;
cout<<"特征数:"<<numFeature<<endl;
ftime ( &tp );
tm = localtime (&(tp.time));
hour = tm->tm_hour;
min = tm->tm_min;
sec = tm->tm_sec;
msec = tp.millitm;
cqdf.test(testFileName);
ftime ( &tp );
tm = localtime (&(tp.time));
time = (tm->tm_hour-hour)*3600000+(tm->tm_min-min)*60000+(tm->tm_sec-sec)*1000+(tp.millitm-msec);
cout<<"time:"<<time<<" ms"<<endl;
right = 0;
total = 0;
for (i=0; i<numClass; i++)
{
cout<<cqdf.sdata.nameClass[i]<<" total:"<<cqdf.resultTotal[i]<<" right:"<<cqdf.resultRight[i]<<" %:"<<cqdf.resultRight[i]*100/cqdf.resultTotal[i]<<endl;
right += cqdf.resultRight[i];
total += cqdf.resultTotal[i];
}
cout<<"mean:"<<100*right/total<<endl;
//RDA分类器交叉验证
/*max = 0;
DOUBLE beta = 0;
DOUBLE gamma = 0;
cout<<endl<<"RDA:"<<endl;
CRda crda;
for (i=0; i<10; i++)
{
for (j=0; j<10; j++)
{
crda.paramBeta = ((DOUBLE)i)/10;//调试出的最佳参数
crda.paramGamma = ((DOUBLE)j)/10;
mean = crda.crossValidation(trainFileName);
cout<<"Beta:"<<crda.paramBeta<<" Gamma:"<<crda.paramGamma<<" mean:"<<mean*100<<endl;
if (mean>max)
{
beta = crda.paramBeta;
gamma = crda.paramGamma;
max = mean;
}
}
}
numClass = crda.sdata.numClass;
numFeature = crda.sdata.numFeature;
cout<<"类别数:"<<numClass<<endl;
cout<<"特征数:"<<numFeature<<endl;
cout<<"最优Beta:"<<beta<<" 最优Gamma:"<<gamma<<" performance:"<<max<<endl;*/
//RDA分类器测试
cout<<endl<<"RDA:"<<endl;
CRda crda;
crda.paramBeta = 0.4;//
crda.paramGamma = 0.1;
crda.train(trainFileName);
numClass = crda.sdata.numClass;
numFeature = crda.sdata.numFeature;
cout<<"类别数:"<<numClass<<endl;
cout<<"特征数:"<<numFeature<<endl;
ftime ( &tp );
tm = localtime (&(tp.time));
hour = tm->tm_hour;
min = tm->tm_min;
sec = tm->tm_sec;
msec = tp.millitm;
crda.test(testFileName);
ftime ( &tp );
tm = localtime (&(tp.time));
time = (tm->tm_hour-hour)*3600000+(tm->tm_min-min)*60000+(tm->tm_sec-sec)*1000+(tp.millitm-msec);
cout<<"time:"<<time<<" ms"<<endl;
right = 0;
total = 0;
for (i=0; i<numClass; i++)
{
cout<<crda.sdata.nameClass[i]<<" total:"<<crda.resultTotal[i]<<" right:"<<crda.resultRight[i]<<" RDA%:"<<crda.resultRight[i]*100/crda.resultTotal[i]<<endl;
right += crda.resultRight[i];
total += crda.resultTotal[i];
}
cout<<"mean:"<<100*right/total<<endl;
//KNN 算法交叉验证
/*max = 0;
int index = 0;
cout<<endl<<"KNN:"<<endl;
CKnn cknn;
for (int z=1; z<31; z++)
{
cknn.paramK = z;
mean = cknn.crossValidation(trainFileName);
cout<<"k="<<z<<" mean:"<<mean*100<<endl;
if (mean>max)
{
index = z;
max = mean;
}
}
numClass = cknn.sdata.numClass;
numFeature = cknn.sdata.numFeature;
cout<<"类别数:"<<numClass<<endl;
cout<<"特征数:"<<numFeature<<endl;
cout<<"最优K:"<<index<<" performance:"<<max*100<<endl;*/
//KNN 算法测试
CKnn cknn;
cknn.paramK = 1;//
cknn.train(trainFileName);
numClass = cknn.sdata.numClass;
numFeature = cknn.sdata.numFeature;
cout<<"类别数:"<<numClass<<endl;
cout<<"特征数:"<<numFeature<<endl;
ftime ( &tp );
tm = localtime (&(tp.time));
hour = tm->tm_hour;
min = tm->tm_min;
sec = tm->tm_sec;
msec = tp.millitm;
cknn.test(testFileName);
ftime ( &tp );
tm = localtime (&(tp.time));
time = (tm->tm_hour-hour)*3600000+(tm->tm_min-min)*60000+(tm->tm_sec-sec)*1000+(tp.millitm-msec);
cout<<"time:"<<time<<" ms"<<endl;
cout<<"k="<<cknn.paramK<<endl;
right = 0;
total = 0;
for (i=0; i<numClass; i++)
{
cout<<cknn.sdata.nameClass[i]<<" total:"<<cknn.resultTotal[i]<<" right:"<<cknn.resultRight[i]<<" %:"<<cknn.resultRight[i]*100/cknn.resultTotal[i]<<endl;
right += cknn.resultRight[i];
total += cknn.resultTotal[i];
}
cout<<"mean:"<<100*right/total<<endl;
//SVM分类器交叉验证
/*cout<<endl<<"SVM:"<<endl;
for (i=0; i<1; i++)
{
for (j=-1; j>-10; j--)
{
CSvm csvm;
csvm.paramC = 10000;
csvm.paramGamma = 1+((DOUBLE)j)/10;
csvm.train(trainFileName);
numClass = csvm.sdata.numClass;
numFeature = csvm.sdata.numFeature;
csvm.test(testFileName);
right = 0;
total = 0;
for (i=0; i<numClass; i++)
{
right += csvm.resultRight[i];
total += csvm.resultTotal[i];
}
cout<<100*right/total<<" ";
}
cout<<endl;
}*/
//SVM分类器测试
svm_node *SV;
cout<<endl<<"SVM:"<<endl;
CSvm csvm;
csvm.train(trainFileName);
numClass = csvm.sdata.numClass;
numFeature = csvm.sdata.numFeature;
cout<<"类别数:"<<numClass<<endl;
cout<<"特征数:"<<numFeature<<endl;
cout<<"nr_class:"<<csvm.model->nr_class<<endl;
cout<<"支持向量总数:"<<csvm.model->l<<endl;
ftime ( &tp );
tm = localtime (&(tp.time));
hour = tm->tm_hour;
min = tm->tm_min;
sec = tm->tm_sec;
msec = tp.millitm;
csvm.test(testFileName);
ftime ( &tp );
tm = localtime (&(tp.time));
time = (tm->tm_hour-hour)*3600000+(tm->tm_min-min)*60000+(tm->tm_sec-sec)*1000+(tp.millitm-msec);
cout<<"time:"<<time<<" ms"<<endl;
right = 0;
total = 0;
for (i=0; i<numClass; i++)
{
cout<<csvm.sdata.nameClass[i]<<" total:"<<csvm.resultTotal[i]<<" right:"<<csvm.resultRight[i]<<" %:"<<csvm.resultRight[i]*100/csvm.resultTotal[i]<<endl;
right += csvm.resultRight[i];
total += csvm.resultTotal[i];
}
cout<<"mean:"<<100*right/total<<endl;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -