- 首页 > 生活 > >
学习Opencv2.4.9---SVM支持向量机1( 四 )
CvMat trainingDataMat = cvMat(16, 2, CV_32FC1, trainingData); // step 2: //训练参数设定CvSVMParams params;params.svm_type = CvSVM::C_SVC;//SVM类型params.kernel_type = CvSVM::LINEAR;//核函数的类型 //SVM训练过程的终止条件, max_iter:最大迭代次数epsilon:结果的精确性params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, FLT_EPSILON ); // step 3: //启动训练过程CvSVM SVM;SVM.train( &trainingDataMat, &labelsMat, NULL,NULL, params); // step 4: //使用训练所得模型对新样本进行分类测试 for (int i=-5; i<15; i++){for (int j=-5; j<15; j++){float a[] = {i,j};CvMat sampleMat;cvInitMatHeader(&sampleMat,1,2,CV_32FC1,a);cvmSet(&sampleMat,0,0,i);// Set M(i,j)cvmSet(&sampleMat,0,1,j);// Set M(i,j)float response = SVM.predict(&sampleMat);cout<}cout<} // step 5: //获取支持向量 int c = SVM.get_support_vector_count(); cout< for (int i=0; i{const float* v = SVM.get_support_vector(i);cout<<*v<<” “;} cout< system(“pause”); return 0;}
运行结果:
文章插图
PS: 统计学习泛化误差界的概念,就是指真实风险应该由两部分内容刻画,一是经验风险,代表了分类器在给定样本上的误差;二是置信风险,代表了我们在多大程度上可以信任分类器在未知文本上分类的结果 。很显然,第二部分是没有办法精确计算的,因此只能给出一个估计的区间,也使得整个误差只能计算上界,而无法计算准确的值(所以叫做泛化误差界,而不叫泛化误差) 。
置信风险与两个量有关,一是样本数量,显然给定的样本数量越大,我们的学习结果越有可能正确,此时置信风险越小;二是分类函数的VC维,显然VC维越大,推广能力越差,置信风险会变大 。
泛化误差界的公式为:R(w)≤Remp(w)+Ф(n/h)
公式中R(w)就是真实风险,Remp(w)就是经验风险,Ф(n/h)就是置信风险 。统计学习的目标从经验风险最小化变为了寻求经验风险与置信风险的和最小,即结构风险最小 。
SVM正是这样一种努力最小化结构风险的算法 。