支持向量机对线性不可分数据的处理

目标

本文档尝试解答如下问题:

  • 在训练数据线性不可分时,如何定义此情形下支持向量机的最优化问题。
  • 如何设置 CvSVMParams 中的参数来解决此类问题。

动机

为什么需要将支持向量机优化问题扩展到线性不可分的情形? 在多数计算机视觉运用中,我们需要的不仅仅是一个简单的SVM线性分类器, 我们需要更加强大的工具来解决 训练数据无法用一个超平面分割 的情形。

我们以人脸识别来做一个例子,训练数据包含一组人脸图像和一组非人脸图像(除了人脸之外的任何物体)。 这些训练数据超级复杂,以至于为每个样本找到一个合适的表达 (特征向量) 以让它们能够线性分割是非常困难的。

最优化问题的扩展

还记得我们用支持向量机来找到一个最优超平面。 既然现在训练数据线性不可分,我们必须承认这个最优超平面会将一些样本划分到错误的类别中。 在这种情形下的优化问题,需要将 错分类(misclassification) 当作一个变量来考虑。新的模型需要包含原来线性可分情形下的最优化条件,即最大间隔(margin), 以及在线性不可分时分类错误最小化。

我们还是从最大化 间隔 这一条件来推导我们的最优化问题的模型(这在 前一节 已经讨论了):

在这个模型中加入错分类变量有多种方法。比如,我们可以最小化一个函数,该函数定义为在原来模型的基础上再加上一个常量乘以样本被错误分类的次数:

然而,这并不是一个好的解决方案,其中一个原因是它没有考虑错分类的样本距离同类样本所属区域的大小。 因此一个更好的方法是考虑 错分类样本离同类区域的距离:

这里为每一个样本定义一个新的参数  , 这个参数包含对应样本离同类区域的距离。 下图显示了两类线性不可分的样本,以及一个分割超平面和错分类样本距离同类区域的距离。

Note

图中只显示了错分类样本的距离,其余样本由于已经处于同类区域内部所以距离为零。

红色和蓝色直线表示各自区域的边际间隔, 每个  表示从错分类样本到同类区域边际间隔的距离。

最后我们得到最优问题的最终模型:

关于参数C的选择, 明显的取决于训练样本的分布情况。 尽管并不存在一个普遍的答案,但是记住下面几点规则还是有用的:

  • C比较大时分类错误率较小,但是间隔也较小。 在这种情形下, 错分类对模型函数产生较大的影响,既然优化的目的是为了最小化这个模型函数,那么错分类的情形必然会受到抑制。
  • C比较小时间隔较大,但是分类错误率也较大。 在这种情形下,模型函数中错分类之和这一项对优化过程的影响变小,优化过程将更加关注于寻找到一个能产生较大间隔的超平面。

源码

你可以从OpenCV源码库文件夹 samples/cpp/tutorial_code/gpu/non_linear_svms/non_linear_svms 下载源码和视频, 或者 从此处下载.

  123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/ml/ml.hpp>#define NTRAINING_SAMPLES   100         // Number of training samples per class #define FRAC_LINEAR_SEP 0.9f // Fraction of samples which compose the linear separable part using namespace cv; using namespace std; int main() { // Data for visual representation const int WIDTH = 512, HEIGHT = 512; Mat I = Mat::zeros(HEIGHT, WIDTH, CV_8UC3); //--------------------- 1. Set up training data randomly --------------------------------------- Mat trainData(2*NTRAINING_SAMPLES, 2, CV_32FC1); Mat labels (2*NTRAINING_SAMPLES, 1, CV_32FC1); RNG rng(100); // Random value generation class // Set up the linearly separable part of the training data int nLinearSamples = (int) (FRAC_LINEAR_SEP * NTRAINING_SAMPLES); // Generate random points for the class 1 Mat trainClass = trainData.rowRange(0, nLinearSamples); // The x coordinate of the points is in [0, 0.4) Mat c = trainClass.colRange(0, 1); rng.fill(c, RNG::UNIFORM, Scalar(1), Scalar(0.4 * WIDTH)); // The y coordinate of the points is in [0, 1) c = trainClass.colRange(1,2); rng.fill(c, RNG::UNIFORM, Scalar(1), Scalar(HEIGHT)); // Generate random points for the class 2 trainClass = trainData.rowRange(2*NTRAINING_SAMPLES-nLinearSamples, 2*NTRAINING_SAMPLES); // The x coordinate of the points is in [0.6, 1] c = trainClass.colRange(0 , 1); rng.fill(c, RNG::UNIFORM, Scalar(0.6*WIDTH), Scalar(WIDTH)); // The y coordinate of the points is in [0, 1) c = trainClass.colRange(1,2); rng.fill(c, RNG::UNIFORM, Scalar(1), Scalar(HEIGHT)); //------------------ Set up the non-linearly separable part of the training data --------------- // Generate random points for the classes 1 and 2 trainClass = trainData

转载于:https://www.cnblogs.com/GarfieldEr007/p/5292297.html

OpenCV支持向量机SVM对线性不可分数据的处理相关推荐

  1. OpenCV之ml 模块. 机器学习:支持向量机(SVM)介绍 支持向量机对线性不可分数据的处理

    支持向量机(SVM)介绍 目标 本文档尝试解答如下问题: 如何使用OpenCV函数 CvSVM::train 训练一个SVM分类器, 以及用 CvSVM::predict 测试训练结果. 什么是支持向 ...

  2. OpenCV支持向量机SVM用于非线性可分离数据

    OpenCV支持向量机SVM用于非线性可分离数据 支持向量机SVM用于非线性可分离数据 目标 动机Motivation 优化问题的扩展 源代码 解释 设置训练数据 设置SVM的参数 训练SVM 显示决 ...

  3. OpenCV支持向量机SVM简介

    OpenCV支持向量机SVM简介 支持向量机SVM简介 目标 什么是SVM? 最佳超平面如何计算? 源代码 解释 设置训练数据 设置SVM的参数 由SVM分类的区域 支持向量 结果 支持向量机SVM简 ...

  4. R语言螺旋线型线性不可分数据xgboost分类:使用xgboost模型来解决螺旋数据的分类问题、可视化模型预测的结果、添加超平面区域渲染并与原始数据标签进行对比分析

    R语言螺旋线型线性不可分数据xgboost分类:使用xgboost模型来解决螺旋数据的分类问题.可视化模型预测的结果.添加超平面区域渲染并与原始数据标签进行对比分析 目录

  5. OpenCV支持向量机SVM的实例(附完整代码)

    OpenCV支持向量机SVM的实例 OpenCV支持向量机SVM的实例 OpenCV支持向量机SVM的实例 #include <opencv2/core.hpp> #include < ...

  6. OpenCV支持向量机SVM和SDG算法的实例(附完整代码)

    OpenCV支持向量机SVM和SDG算法的实例 OpenCV支持向量机SVM和SDG算法的实例 OpenCV支持向量机SVM和SDG算法的实例 #include "opencv2/core. ...

  7. SVM之线性不可分与核技巧

    跟我一起机器学习系列文章将首发于公众号:月来客栈,欢迎文末扫码关注! 在前面两篇文章中,笔者通过两个角度来介绍了什么是支持向量机.不过说一千道一万,还是不如动手来做做.在本篇文章中,笔者将首先介绍如何 ...

  8. Python,OpenCV基于支持向量机SVM的手写数字OCR

    Python,OpenCV基于支持向量机SVM的手写数字OCR 1. 效果图 2. SVM及原理 2. 源码 2.1 SVM的手写数字OCR 2.2 非线性SVM 参考 上一节介绍了基于KNN的手写数 ...

  9. 监督学习 | SVM 之线性支持向量机原理

    文章目录 支持向量机 1. 线性可分支持向量机 1.1 间隔计算公式推导 1.2 硬间隔最大化 1.2.1 原始问题 1.2.2 对偶算法 1.3 支持向量 2. 线性支持向量机 2.1 软间隔最大化 ...

最新文章

  1. java 存取xml数据_JAVA读取XML文件数据
  2. Xshell连接服务器桌面调用服务器的图形==Xmanager的===Xbrowser===XDMCP远程桌面===调用virt-mannager管理工具;、Xshell用普通用户调用图形
  3. JSONP原理以及安全问题
  4. 黑苹果找不到触控板_苹果App内测找不到苹果企业签名怎么办?
  5. python消费datahub_DataHub使用指南-阿里云开发者社区
  6. linux:date 命令
  7. Android 支付宝登录
  8. 关于vue中使用iconfont
  9. STM32之SPI主机例程
  10. Java程序员最应该学习的几个面向对象的设计原则
  11. R语言学习笔记(三)多元数据的数据特征、相关分析与图形表示
  12. camera(18)---双摄像头深度剖析 :双Camera的生态链
  13. 计算机二级之Office应用之Excel中的函数(3)
  14. mysql操作数据库进行封装实现增删改查功能
  15. 关键字 : this /self / parent
  16. ES6学习笔记九(函数的扩展)
  17. 交警高德强联手 助威吉林马拉松
  18. matlab手眼标定
  19. 化工人员定位安全管理系统解决方案
  20. 计算机高手应该具备的知识,大学计算机基础超详细知识点(高手总结),强列推荐...

热门文章

  1. matlab kill
  2. if you go to the station early, what will you get
  3. 收到了7封拒信的观后感哈哈哈哈哈哈哈哈哈哈
  4. 哥伦比亚大学计算机工程面试题
  5. HASHSET不能预留容量问题
  6. 在Linux操作系统下使用虚拟光驱的方法
  7. 具有只读属性的ComboBox
  8. 《Python编程从入门到实践》学习笔记6:字典
  9. 2017-10-9(Volley使用范例源码分析)
  10. LINUX性能调优方法总结