C++代码实现MATLAB中的fitcsvm函数功能

发布时间:2026/10/12 6:54:02
C++代码实现MATLAB中的fitcsvm函数功能 // // 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;}

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询