考试通知
// // fitcsvm 的独立 C 实现SMO RBF 核无第三方依赖// 编译: g -stdc17 svm_standalone.cpp -o svm_standalone// 运行: ./svm_standalone// #includeiostream#includevector#includecmath#includeiomanipstructSample{doublex[2];doubley;};classSVM{public:doubleC1.0,gamma1.0,tol1e-3;std::vectorSampleD;std::vectordoublealpha;doubleb0;// RBF 核: K(a,c) exp(-gamma * ||a-c||^2)doubleK(constSamplea,constSamplec)const{doubled0;for(intk0;k2;k)d(a.x[k]-c.x[k])*(a.x[k]-c.x[k]);returnstd::exp(-gamma*d);}// 决策函数 f(x) sum_i alpha_i * y_i * K(x_i, x) bdoubledec(constSamplex)const{doubles0;for(inti0;i(int)D.size();i)salpha[i]*D[i].y*K(D[i],x);returnsb;}// SMO 训练voidtrain(conststd::vectorSampledata){Ddata;intn(int)D.size();alpha.assign(n,0.0);b0.0;for(intiter0;iter200;iter){intchanged0;for(inti0;in;i){doubleEidec(D[i])-D[i].y;// KKT 违反检查if(!((D[i].y*Ei-tolalpha[i]C)||(D[i].y*Eitolalpha[i]0)))continue;for(intj0;jn;j){if(ji)continue;doubleEjdec(D[j])-D[j].y;doubleaialpha[i],ajalpha[j];// 计算 alpha_j 的上下界 L, HdoubleL,H;if(D[i].y!D[j].y){Lstd::max(0.0,aj-ai);Hstd::min(C,Caj-ai);}else{Lstd::max(0.0,aiaj-C);Hstd::min(C,aiaj);}if(LH)continue;doubleeta2*K(D[i],D[j])-K(D[i],D[i])-K(D[j],D[j]);if(eta0)continue;// 更新 alpha_jdoubleajNaj-D[j].y*(Ei-Ej)/eta;if(ajNH)ajNH;if(ajNL)ajNL;if(std::fabs(ajN-aj)1e-5)continue;// 更新 alpha_idoubleaiNaiD[i].y*D[j].y*(aj-ajN);// 更新偏置 bdoubleb1b-Ei-D[i].y*(aiN-ai)*K(D[i],D[i])-D[j].y*(ajN-aj)*K(D[i],D[j]);doubleb2b-Ej-D[i].y*(aiN-ai)*K(D[i],D[j])-D[j].y*(ajN-aj)*K(D[j],D[j]);if(aiN0aiNC)bb1;elseif(ajN0ajNC)bb2;elseb(b1b2)/2;alpha[i]aiN;alpha[j]ajN;changed;break;}}if(changed0)break;}}doublepredict(constSamplex)const{returndec(x)0?1.0:-1.0;}intnumSV()const{intc0;for(doublea:alpha)if(a1e-8)c;returnc;}};intmain(){// ---------- 1. 训练数据XOR 分布 ----------std::vectorSampletrain{{{1.0,1.0},1.0},{{-1.0,1.0},-1.0},{{-1.0,-1.0},-1.0},{{1.0,-1.0},1.0}};std::coutstd::fixedstd::setprecision(2);std::cout Training Data \n;for(inti0;i(int)train.size();i)std::cout Sample i: y(train[i].y0?1:-1) x[train[i].x[0], train[i].x[1]]\n;std::cout\n;// ---------- 2. 配置参数对应 fitcsvm 的 Name-Value ----------SVM svm;svm.C1.0;// BoxConstraintsvm.gamma5.0;// 1 / (2 * KernelScale^2)svm.tol1e-3;std::cout SVM Parameters \n;std::cout C svm.C\n;std::cout gamma svm.gamma\n;std::cout tol svm.tol\n\n;// ---------- 3. 训练 ----------std::cout Training ...\n;svm.train(train);std::cout Training done.\n\n;// ---------- 4. 模型信息 ----------std::coutstd::setprecision(4);std::cout Model Info \n;std::cout Support vectors svm.numSV()\n;std::cout Bias (b) svm.b\n;std::cout Alphas [;for(inti0;i(int)svm.alpha.size();i)std::coutsvm.alpha[i](i1(int)svm.alpha.size()?, :);std::cout]\n\n;// ---------- 5. 预测 ----------std::cout Predictions \n;std::vectorSampletests{{{1.0,1.0},1.0},{{-1.0,-1.0},-1.0},{{0.5,0.5},1.0},{{-0.5,-0.5},-1.0}};for(constautot:tests){doubledsvm.dec(t);doublepsvm.predict(t);std::cout x[std::setw(5)t.x[0], std::setw(5)t.x[1]] decisionstd::setw(8)d predicted(p0?1:-1) expected(t.y0?1:-1)(pt.y? [OK]: [X])\n;}std::cout\n Done.\n;return0;}
C++代码实现MATLAB中的fitcsvm函数功能
NEXT STEP
看完公告,下一步怎么走?
把报考交给靠谱的人:材料预审、批次抢报、考前辅导、复审提醒,全程有人跟。