⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainprocess.cpp

📁 该程序包实现了几个常用的模式识别分类器算法
💻 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 + -