代码中的alpha和有些教材中的lamda是同意义的值,在此记录说明

bits/stdc++.h是标准C和标准C++库的汇总库,不属于标准C/C++,但是省事。很多编译器是支持的,VS不支持

样本等均为随机生成

可以通过更改K函数修改核函数,此处为线性核

#include <bits/stdc++.h>
#define vd vector<double>
#define vvd vector<vd>
#define ull long long unsigned int
#define MY_RAND_MAX ((RAND_MAX<<15)|RAND_MAX)
using namespace std;//#define DEBUG
//向量运算
template <class T>
T operator* (const vector<T>&AT,const vector<T>&B){T sum=0;for(ull i=0;i<AT.size()&&i<B.size();i++){sum+=AT[i]*B[i];}return sum;
}
template <class T>
vector<T> operator*(const vector<T>&A,T k){vector<T> kA(A);for(auto&x:kA)x*=k;return kA;
}template <class T>
vector<T> operator*(T k,const vector<T>&A){vector<T> kA(A);for(auto&x:kA)x*=k;return kA;
}//生成随机数
inline double my_rand(){return (rand()<<15)|rand();
}inline double my_rand_double(){return my_rand() / double(MY_RAND_MAX);
}inline double my_rand_double(double st,double ed){return my_rand_double()*(ed-st)+st;
}//esp
const double esp=1e-7;
const double inf=DBL_MAX;
//α表 E表 K表
vd alpha,E;
vvd K;
//训练集
vvd x;
vd y;
//测试集
vvd x_test;
vd y_test;
//生成训练集样本的分类标准
double b;
vd omega;//训练集样本容量与维度,测试集容量
int n,m;
int n_test;//训练结果
double b_star=0;//返回由alpha计算得到的omega_star
void omega_star(vd&res){res.clear();res.resize(m,0);for(int i=0;i<n;i++)if(alpha[i]>esp){for(int j=0;j<m;j++) {res[j]+=alpha[i]*y[i]*x[i][j];}}
}//初始化K表
void init_K(){K.resize(n,vd(n));for(int i=0;i<n;i++)for(int j=0;j<n;j++){K[i][j]=x[i]*x[j];}
}//g函数
double g(int i){
//E[i]=g(i)-y[i];return E[i]+y[i];
}//更新E表
void set_E(){for(int i=0;i<n;i++){double res=b_star-y[i];for(int j=0;j<n;j++)if(alpha[j]>esp){if(abs(y[j]-1.0)<esp)res+=alpha[j]*K[i][j];elseres-=alpha[j]*K[i][j];}E[i]=res;}
}//一步更新
void step(int pos1,int pos2){double alpha_p1_new;double alpha_p2_new;double alpha_p1_old=alpha[pos1];double alpha_p2_old=alpha[pos2];double L,H;double K11=K[pos1][pos1];double K12=K[pos1][pos2];double K22=K[pos2][pos2];double y1=y[pos1];double y2=y[pos2];double E1=E[pos1];double E2=E[pos2];//计算L和Hif(y1==y2){L=0;H=alpha_p1_old+alpha_p2_old;}else {L=max(0.0,alpha_p2_old-alpha_p1_old);H=inf;}//更新两个alphaalpha_p2_new=alpha_p2_old+y2*(E1-E2)/(K11+K22-K12-K12);if(alpha_p2_new>H)alpha_p2_new=H;else if(alpha_p2_new<L)alpha_p2_new=L;alpha_p1_new=alpha_p1_old+y1*y2*(alpha_p2_old-alpha_p2_new);alpha[pos1]=alpha_p1_new;alpha[pos2]=alpha_p2_new;//更新b_stardouble b_p1_new=-E1-y1*K11*(alpha_p1_new-alpha_p1_old)-y2*K12*(alpha_p2_new-alpha_p2_old)+b_star;double b_p2_new=-E2-y1*K12*(alpha_p1_new-alpha_p1_old)-y2*K22*(alpha_p2_new-alpha_p2_old)+b_star;b_star=(b_p1_new+b_p2_new)/2.0;//更新Eset_E();}bool KKT(int i){if(abs(alpha[i])<=esp){if(y[i]==1)return g(i)>=1-esp;elsereturn g(i)<=-1+esp;}else {return abs(y[i]-g(i))<=esp;}
}bool test(int i,int j){return E[i]*E[j]<0;/*return abs(E[i]-E[j])>0.1;*/
}void run(){bool flag=true;int ct=0;#ifdef DEBUGint loop = 0;while(flag){cout<<loop++<<endl;#elsewhile(flag){#endif // DEBUGflag=false;for(int i=0;i<n;i++)if(!KKT(i)){for(int j=0;j<n;j++)if((!KKT(i)&&i!=j)&&((ct!=2&&test(i,j))||(alpha[j]>esp&&alpha[i]>esp))){flag=true;step(i,j);
#ifdef DEBUGcout<<"(i,j) = "<<'('<<i<<','<<j<<")\n";for(ull i=0;i<alpha.size();i++){cout<<alpha[i]<<' ';}cout<<'\n';vd o_star;omega_star(o_star);cout<<o_star[0]<<' '<<o_star[1]<<' '<<b_star<<"\n";cout<<"E:\n";for(ull i=0;i<E.size();i++)cout<<E[i]<<' ';cout<<"\n\n";
#endif // DEBUGint cntf0=0;for(int k=0; k<n; k++) if(alpha[k]>esp) cntf0++;if(cntf0>=n*0.2&&ct==0) ct=1;if(ct==1&&cntf0<=n*0.1) ct=2;//                if(KKT(i))
//                    break;}}}#ifdef DEBUGcout<<"loop="<<loop<<endl;#endif
}int main(){
#ifdef DEBUG//freopen("log.txt","w",stdout);
#endifsrand(time(NULL));n=70;m=3;omega.resize(m);omega[0]=2;omega[1]=-0.5;omega[2]=-1.5;b=1;x.resize(n,vd(m));for(int i=0;i<n;i++){for(int j=0;j<m;j++)x[i][j]=my_rand_double(-10,10);}y.resize(n);for(int i=0;i<n;i++){double sum=0;for(int j=0;j<m;j++)sum+=x[i][j]*omega[j];if(sum+b>0)y[i]=1;elsey[i]=-1;}init_K();alpha.resize(n);E.resize(n);set_E();#ifdef DEBUGcout<<"train_set:"<<endl;for(int i=0;i<n;i++){for(int j=0;j<m;j++)cout<<x[i][j]<<' ';cout<<':';cout<<y[i]<<endl;}cout<<endl;cout<<"K:\n"<<endl;for(ull i=0;i<K.size();i++){for(ull j=0;j<K[i].size();j++)cout<<K[i][j]<<' ';cout<<endl;}#endif //DEBUGrun();cout<<"alpha:\n";for(ull i=0;i<alpha.size();i++){cout<<alpha[i]<<' ';}cout<<"\n\n";cout<<"ans:\n";vd o_star;omega_star(o_star);cout<<"ans_omega:\n";for(ull i=0;i<o_star.size();i++)cout<<o_star[i]<<' ';cout<<"\nb_star: "<<b_star<<"\n\n";#ifdef DEBUGcout<<"E:\n";for(ull i=0;i<E.size();i++){cout<<E[i]<<' ';}cout<<"\n\n";cout<<"G:\n";for(int i=0;i<n;i++){cout<<g(i)<<' ';}cout<<"\n\n";
#endif //DEBUG//测试集n_test=1000;x_test.resize(n_test,vd(m));for(int i=0;i<n_test;i++){for(int j=0;j<m;j++)x_test[i][j]=my_rand_double(-10,10);}y_test.resize(n_test);for(int i=0;i<n_test;i++){double sum=0;for(int j=0;j<m;j++)sum+=x_test[i][j]*omega[j];if(sum+b>0)y_test[i]=1;elsey_test[i]=-1;}int t=0;int f=0;for(int i=0;i<n_test;i++){double sum=0;for(int j=0;j<m;j++)sum+=x_test[i][j]*o_star[j];double ans;if(sum+b_star>0)ans=1;elseans=-1;if(ans==y_test[i])t++;else {f++;cout<<"false: ";for(int j=0;j<m;j++)cout<<x_test[i][j]<<' ';cout<<endl;}}cout<<"number of true/false:"<<t<<"/"<<f<<endl;
}

SVM支持向量机分类算法C++实现 零调库相关推荐

  1. 【数据挖掘】十大算法之SVM支持向量机分类算法

    目录 1 基本概念 2 线性可分支持向量机 2.1 定义 2.2 相关概念 2.3 学习算法 4 线性支持向量机 4.1 软间隔最大化 4.2 线性支持向量机的原始最优化问题 4.3 线性支持向量机定 ...

  2. 在opencv3中实现机器学习之:利用svm(支持向量机)分类

    svm分类算法在opencv3中有了很大的变动,取消了CvSVMParams这个类,因此在参数设定上会有些改变. opencv中的svm分类代码,来源于libsvm. #include "s ...

  3. 分类预测 | MATLAB实现SVM(支持向量机)分类预测

    分类预测 | MATLAB实现SVM(支持向量机)多分类预测 目录 分类预测 | MATLAB实现SVM(支持向量机)多分类预测 基本介绍 环境配置 程序设计 参考资料 基本介绍 支持向量机的基础概念 ...

  4. Python 支持向量机分类算法实现

    支持向量机也是常用的一类分类模型,它通过在两类数据之间寻找一个超平面来分隔不同类的数据.支持向量机最后对应一个二次规划模型(其最优化问题的对偶问题),可以使用通常二次规划求解方法求解,也可以使用Pla ...

  5. 【Basic】SVM(支持向量机)分类算法

    支持向量机(Support Vector Machine,SVM)算法兼具形式优美和高效好用,难得地受到了跨学术界和工业界的好评. 一.SVM 算法介绍 在支持向量机中有三个重要概念,也是组成支持向量 ...

  6. [Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  7. SVM支持向量机算法

    参考资料:http://www.cppblog.com/sunrise/archive/2012/08/06/186474.html                       http://blog ...

  8. Python 基于SVM和KNN算法的红酒分类

    Python 机器学习之红酒分类问题 文章目录 Python 机器学习之红酒分类问题 前言 一.问题和目标是什么 1.原题 2.题目分析 二.算法简介 三.代码实现 1.算法流程框架 2.第三方库调用 ...

  9. 遗传算法_粒子群算法优化支持向量机分类预测-附代码

    遗传算法/粒子群算法优化支持向量机分类预测-附代码 文章目录 遗传算法/粒子群算法优化支持向量机分类预测-附代码 1. 支持向量机简介与参数优化的原理 1.1 支持向量机SVM简介 1.2 优化参数的 ...

最新文章

  1. GPT-3等三篇论文获NeurIPS 2020 最佳论文奖!华人一作获时间检验奖
  2. StringBuffer、StringBuilder区别以及Synchronized原理
  3. Mybatis与Hibernate的详细对比
  4. vue获取DOM元素并设置属性
  5. php 静态方法特点,浅析php静态方法与非静态方法的用法区别
  6. 【CRMEB知识付费系统v1.4.4】
  7. 新手tiktok怎么做?海外tiktok怎么赚钱!
  8. arm b bl 地址无关码_海边同居有甜有虐,又一部BL日剧来了
  9. UNITY自带的3D object没有三角形?
  10. 虚拟机上网设置教程之如何用虚拟机上网
  11. 用友修改服务器名称,用友修改服务器地址
  12. 毕业设计 - 题目 :基于大数据的疫情数据分析及可视化系统
  13. 计算机与量子力学交叉,量子计算主要是基于量子力学的相干特征.PPT
  14. java visual foxpro_从Java访问Visual FoxPro数据库
  15. 为什么快捷指令无法将媒体转换为文本_小红书去水印快捷指令重磅更新,连视频封面图都可以下载了...
  16. UG NX 12 抽取面特征
  17. 五年之内,博士学历是否也会开始内卷?
  18. 有个空间,名叫 Gamma
  19. 阿里云赵明山:详解灵活可插拔的渐进式发布框架OpenKruise Rollout
  20. 亲身经历在国企搞IT:自我总结500页“Java成长笔记”,谁说待国企就是养老!?

热门文章

  1. 播放器JPlayer的使用及遇到的问题
  2. 直击CES 2019 带你围观思岚科技那些“亮眼”展品
  3. 红黑树效率为甚恶魔是log_Linux内核-深入理解红黑树与B+树应用场景
  4. 一次搞懂什么是IP 子网掩码 默认网关 DNS
  5. MongoDB在不同主机间复制数据库和集合
  6. java架构师什么学校好_Java架构师之路:年薪八十万的架构师课程
  7. 2021-12-02-easyExcle使用心得
  8. win10 晃动一个窗口,显示桌面(所有窗口全部最小化)
  9. 裸机服务器安装centos7新手心酸历程
  10. mysql Ngram 全文索引_MySQL 全文检索 ngram Mybatis