SVM原理:

通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。假设给定一些分属于两类的2维点,这些点可以通过直线分割, 我们要找到一条最优的分割线,如下图所示:

在上面的图中, 你可以直觉的观察到有多种可能的直线可以将样本分开。 那是不是某条直线比其他的更加合适呢? 我们可以凭直觉来定义一条评价直线好坏的标准。很明显,距离样本太近的直线不是最优的,因为这样的直线对噪声敏感度高,泛化性较差。 因此我们的目标是找到一条直线,离所有点的距离最远。
由此, SVM算法的实质是找出一个能够将某个值最大化的超平面,这个值就是超平面离所有训练样本的最小距离。这个最小距离用SVM术语来说叫做 间隔(margin) 。 概括一下,最优分割超平面 最大化 训练数据的间隔。如下图中间的斜线就是最大间隔向量:

至于如何去求解这个最大间隔向量,请参考http://blog.csdn.net/sealyao/article/details/6442403,说的很详细。

代码及注释:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/ml/ml.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{int width = 512, height = 512;Mat image = Mat::zeros(height, width, CV_8UC3);// 1,设置样本训练数据float labels[4] = { 1.0, -1.0, -1.0, -1.0 };Mat labelsMat(3, 1, CV_32FC1, labels);float trainingData[4][2] = { { 501, 10 }, { 255, 10 }, { 501, 255 }, { 10, 501 } };Mat trainingDataMat(3, 2, CV_32FC1, trainingData);// 2,设置SVM的初始参数CvSVMParams params;params.svm_type = CvSVM::C_SVC;params.kernel_type = CvSVM::LINEAR;//直接线性化处理params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);//求最大间隔向量的算法,最大迭代次数和容许误差// 3,训练CvSVM SVM;SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params);Vec3b green(0, 255, 0), blue(255, 0, 0);//4,进行预测for (int i = 0; i < image.rows; ++i){for (int j = 0; j < image.cols; ++j){Mat sampleMat = (Mat_<float>(1, 2) << i, j);float response = SVM.predict(sampleMat);if (response == 1)image.at<Vec3b>(j, i) = green;else if (response == -1)image.at<Vec3b>(j, i) = blue;}}// 显示样本的训练数据int thickness = -1;int lineType = 8;circle(image, Point(501, 10), 5, Scalar(0, 0, 0), thickness, lineType);circle(image, Point(255, 10), 5, Scalar(255, 255, 255), thickness, lineType);circle(image, Point(501, 255), 5, Scalar(255, 255, 255), thickness, lineType);circle(image, Point(10, 501), 5, Scalar(255, 255, 255), thickness, lineType);// Show support vectorsthickness = 2;lineType = 8;int c = SVM.get_support_vector_count();for (int i = 0; i < c; ++i){const float* v = SVM.get_support_vector(i);cout << "最大间隔向量方向" << v[0] << " " << v[1] << endl;circle(image, Point((int)v[0], (int)v[1]), 6, Scalar(0, 0, 255), thickness, lineType);}imwrite("resultSVM.png", image);imshow("SVM", image); waitKey(0);}

注意:SVM算法只能分割两部分,如果需要多个分割,请先把分割出一块,把其他部分当作一个整体,然后递归分割。

SVM支持向量分类器原理及OpenCV实现相关推荐

  1. 支持向量所在超平面方程_支持向量机通俗导论:理解SVM的三层境界(一)

    前言 动笔写这个支持向量机(support vector machine)是费了不少劲和困难的,原因很简单,一者这个东西本身就并不好懂,要深入学习和研究下去需花费不少时间和精力,二者这个东西也不好讲清 ...

  2. SVM分类器原理详解

    SVM分类器原理详解 标签: svm文本分类java 2015-08-21 11:51 2399人阅读 评论(0) 收藏 举报  分类: 数据挖掘 文本处理(16)  机器学习 分类算法(10)  目 ...

  3. 机器学习分类器——案例(opencv sklearn svm ann)

    机器学习分类器--案例(opencv sklearn svm ann python) ps:最近师姐给我们留了一个任务,记录一下从一开始的什么都不懂到现在把任务做出来,并从中学习到的东西吧.... 语 ...

  4. 支持向量机 (SVM)分类器原理分析与基本应用

    转自:穆晨 阅读目录 前言 预备术语 算法原理 如何计算最优超平面 使用SMO - 高效优化算法求解 α 值 非线性可分情况的大致解决思路 小结 回到顶部 前言 支持向量机,也即SVM,号称分类算法, ...

  5. 机器学习——支持向量机(SVM)之超平面、间隔与支持向量

    描述 SVM是一种二类分类模型,基本模型是定义在特征空间中的间隔最大的线性分类器. 学习策略是间隔最大化. 训练集线性可分时,通过硬间隔最大化,学习一个线性可分支持向量机: 训练集近似线性可分时,通过 ...

  6. 学习SVM(四) 理解SVM中的支持向量(Support Vector)

    学习SVM(四) 理解SVM中的支持向量(Support Vector) 版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/chaipp0607/articl ...

  7. 【视频】支持向量机SVM、支持向量回归SVR和R语言网格搜索超参数优化实例

    最近我们被客户要求撰写关于SVM的研究报告,包括一些图形和统计输出. 什么是支持向量机 (SVM)? 我们将从简单的理解 SVM 开始. [视频]支持向量机SVM.支持向量回归SVR和R语言网格搜索超 ...

  8. ML之SVM:基于sklearn的svm算法实现对支持向量的数据进行标注

    ML之SVM:基于sklearn的svm算法实现对支持向量的数据进行标注 目录 输出结果 实现代码 输出结果 实现代码 import numpy as np import matplotlib.pyp ...

  9. 深度学习与计算机视觉系列(3)_线性SVM与SoftMax分类器--在深度学习的视觉分类中的,这两个分类器的原理和比较

    作者: 寒小阳  时间:2015年11月.  出处:http://blog.csdn.net/han_xiaoyang/article/details/49999299  声明:版权所有,转载请注明出 ...

  10. 算法工程师面试备战笔记9_支持向量机(SVM)中的支持向量是什么意思

    题目 我们在下面的二元标签的数据集上训练一个线性SVM模型 这个模型中的支持向量是哪些? A. (−1,1),(1,1),(2,1) B. (−1,1),(−1,−1),(2,1) C. (0,1), ...

最新文章

  1. 顺序结构,判断结构 if,switch
  2. YOLOv5-LibTorch
  3. 读债务危机0812:接管房利美和房地美
  4. 5G NR RLC:RLC架构和RLC entity
  5. mybatis学习(37):动态sql-trim
  6. (tmp 8) 0xff;
  7. EnterpriseDB Replication,复制Oracle数据测试(1)
  8. python求正整数的百位部分_Python程序设计课后习题答案
  9. iphone储存空间系统怎么清理_系统项占用了 iPhone 过多的储存空间怎么办?
  10. canvas drawbitmap不出现_JS实现简单的画板(canvas),可在PC和移动端实现。
  11. java 同步块_java 同步块(Java Synchronized Blocks)
  12. H5页面在自己APP中图标显示正常,接入钉钉请求.woff图标字体报错
  13. Java教师评估系统_jsp教师在线评价系统
  14. 1079:计算分数加减表达式的值 题解 信息学奥赛 NOIP
  15. python全栈工程师薪资待遇_java,python和全栈工程师学那个在未来更有前途?
  16. Word | 图片被文字遮挡
  17. centos7 linux重置密码
  18. mysql计算1000天后的日期_Mysql中常用的日期函数
  19. 仔细体验,我想从产品设计的角度分析分析微信的声音锁
  20. 网友对spring.net的理解:(为什么要用晦涩难懂的spring?)

热门文章

  1. Java的System.out.println并不等于C的printf
  2. 跟人合作人工智能,方案没有,钱又不出,这怎么合作?
  3. maven只是经手,不是触发:org.apache.maven.lifecycle.LifecycleExecutionException
  4. Eclipse中修改项目的文本字符集编码
  5. 集成电路的技术极限之后,怎么办?
  6. CPU个数引起服务器软件启动失败的事故
  7. 管理感悟:要想到自己脖子后面有灰
  8. Day10_界面叠加处理
  9. c++ new操作符(new operator)、operator new、placement new 、operator new[] 及相对应的delete 操作符、operator delete
  10. 在c语言中逻辑或运算符失身额,我的Fortran基本用法小结【转载】