news 2026/10/12 6:53:58

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++代码实现MATLAB中的fitcsvm函数功能
// ============================================================// fitcsvm 的独立 C++ 实现(SMO + RBF 核,无第三方依赖)// 编译: g++ -std=c++17 svm_standalone.cpp -o svm_standalone// 运行: ./svm_standalone// ============================================================#include<iostream>#include<vector>#include<cmath>#include<iomanip>structSample{doublex[2];doubley;};classSVM{public:doubleC=1.0,gamma=1.0,tol=1e-3;std::vector<Sample>D;std::vector<double>alpha;doubleb=0;// RBF 核: K(a,c) = exp(-gamma * ||a-c||^2)doubleK(constSample&a,constSample&c)const{doubled=0;for(intk=0;k<2;++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(constSample&x)const{doubles=0;for(inti=0;i<(int)D.size();++i)s+=alpha[i]*D[i].y*K(D[i],x);returns+b;}// SMO 训练voidtrain(conststd::vector<Sample>&data){D=data;intn=(int)D.size();alpha.assign(n,0.0);b=0.0;for(intiter=0;iter<200;++iter){intchanged=0;for(inti=0;i<n;++i){doubleEi=dec(D[i])-D[i].y;// KKT 违反检查if(!((D[i].y*Ei<-tol&&alpha[i]<C)||(D[i].y*Ei>tol&&alpha[i]>0)))continue;for(intj=0;j<n;++j){if(j==i)continue;doubleEj=dec(D[j])-D[j].y;doubleai=alpha[i],aj=alpha[j];// 计算 alpha_j 的上下界 L, HdoubleL,H;if(D[i].y!=D[j].y){L=std::max(0.0,aj-ai);H=std::min(C,C+aj-ai);}else{L=std::max(0.0,ai+aj-C);H=std::min(C,ai+aj);}if(L>=H)continue;doubleeta=2*K(D[i],D[j])-K(D[i],D[i])-K(D[j],D[j]);if(eta>=0)continue;// 更新 alpha_jdoubleajN=aj-D[j].y*(Ei-Ej)/eta;if(ajN>H)ajN=H;if(ajN<L)ajN=L;if(std::fabs(ajN-aj)<1e-5)continue;// 更新 alpha_idoubleaiN=ai+D[i].y*D[j].y*(aj-ajN);// 更新偏置 bdoubleb1=b-Ei-D[i].y*(aiN-ai)*K(D[i],D[i])-D[j].y*(ajN-aj)*K(D[i],D[j]);doubleb2=b-Ej-D[i].y*(aiN-ai)*K(D[i],D[j])-D[j].y*(ajN-aj)*K(D[j],D[j]);if(aiN>0&&aiN<C)b=b1;elseif(ajN>0&&ajN<C)b=b2;elseb=(b1+b2)/2;alpha[i]=aiN;alpha[j]=ajN;++changed;break;}}if(changed==0)break;}}doublepredict(constSample&x)const{returndec(x)>0?1.0:-1.0;}intnumSV()const{intc=0;for(doublea:alpha)if(a>1e-8)++c;returnc;}};intmain(){// ---------- 1. 训练数据(XOR 分布) ----------std::vector<Sample>train={{{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::cout<<std::fixed<<std::setprecision(2);std::cout<<"=== Training Data ===\n";for(inti=0;i<(int)train.size();++i)std::cout<<" Sample "<<i<<": y="<<(train[i].y>0?"+1":"-1")<<" x=["<<train[i].x[0]<<", "<<train[i].x[1]<<"]\n";std::cout<<"\n";// ---------- 2. 配置参数(对应 fitcsvm 的 Name-Value) ----------SVM svm;svm.C=1.0;// 'BoxConstraint'svm.gamma=5.0;// 1 / (2 * KernelScale^2)svm.tol=1e-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::cout<<std::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(inti=0;i<(int)svm.alpha.size();++i)std::cout<<svm.alpha[i]<<(i+1<(int)svm.alpha.size()?", ":"");std::cout<<"]\n\n";// ---------- 5. 预测 ----------std::cout<<"=== Predictions ===\n";std::vector<Sample>tests={{{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(constauto&t:tests){doubled=svm.dec(t);doublep=svm.predict(t);std::cout<<" x=["<<std::setw(5)<<t.x[0]<<", "<<std::setw(5)<<t.x[1]<<"]"<<" decision="<<std::setw(8)<<d<<" predicted="<<(p>0?"+1":"-1")<<" expected="<<(t.y>0?"+1":"-1")<<(p==t.y?" [OK]":" [X]")<<"\n";}std::cout<<"\n>>> Done.\n";return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/12 6:53:27

YOLO26改进 - 注意力机制 | MLCA混合局部通道注意力:多维度特征融合破解信息局限,增强复杂场景感知能力

前言 本文介绍了轻量级的Mixed Local Channel Attention(MLCA)模块及其在YOLO26中的结合应用。MLCA模块同时考虑通道、空间、局部和全局信息,其输入特征先经局部池化,再通过两个分支分别处理全局与局部信息,最后经一维卷积、反池化融合信息。该模块能提取局部空间信息、捕…

作者头像 李华
网站建设 2026/10/12 6:52:56

Python内置函数详解:classmethod、getattr、hasattr、callable等动态属性操作

在Python里折腾类对象和属性&#xff0c;最绕不开的就是这几个内置函数&#xff1a;classmethod、delattr、dir、hasattr、getattr、callable。很多人一开始记不住它们的区别&#xff0c;总觉得这些是“边角料”&#xff0c;但真正写框架、做插件化设计、或者调试线上问题的时候…

作者头像 李华
网站建设 2026/10/12 6:51:58

CentOS 8 Redis安装配置与卸载清理实操指南

说实话&#xff0c;CentOS 8 上装 Redis 这事儿&#xff0c;看着简单&#xff0c;但这两年坑是真不少。系统源里自带的版本偏老、模块流切换搞不明白、装完忘记配密码被扫描器盯上&#xff0c;卸载的时候又因为残留文件导致重装后数据错乱——这些场面我见过太多次了。这篇文章…

作者头像 李华
网站建设 2026/10/12 6:51:24

权重开放时代:技术超越、政策博弈与商业重构实战指南

1. 从“权重开放”到“生态重构”的底层逻辑1.1 为什么开源权重突然成了兵家必争之地过去两年&#xff0c;模型开源这件事发生了质的变化。早期大家理解的“开源”&#xff0c;大多停留在开放推理接口、放出部分训练代码的层面&#xff0c;权重本身是锁在保险柜里的。但从某个时…

作者头像 李华
网站建设 2026/10/12 6:47:28

USACO Silver Milk Visits:树上路径存在性查询的并查集与LCA解法

如果你在准备 USACO Silver 组&#xff0c;2019 年 12 月的这道 Milk Visits 是绕不开的经典题。名字很温馨&#xff0c;农场、奶牛、牛奶&#xff0c;骨子里却是一道标准的树上路径查询问题&#xff1a;给你一棵 N 个节点的树&#xff0c;每个节点标记成 G 或 H&#xff0c;再…

作者头像 李华
网站建设 2026/10/12 6:45:48

ROS 2单兵开发实战:用代码大模型做数字CTO

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华