支持向量机的原理这里也就不阐述了,我也不太会。我大概的理解就是和KNN一样是个分类器,可以想象以下,两类样本点可以用很多条线分开,但是那一条是最优呢?支持向量机中利用支持向量(可能是样本中的几个点,具体怎么取这个向量不需要我们考虑),然后计算支持向量到分割线的距离,距离最大的那条分界线那就是最优分类了。所以SVM中用的是间隔最大化思想。


参数设置

支持向量机只有一成为一个很强的算法,是因为它能够适应各种情况,也因如此参数设置比KNN要多很多。OpenCV中给出接口:

SVM中有不同的内核,不同的内核计算公式中有不同的参数,所以要根据所选内核来调整参数;

一般用linear线性内核,poly多项式内核,rbf 基于径向的函数

关于核的:https://blog.csdn.net/qq_30263737/article/details/83338958

enum KernelTypes {/** Returned by SVM::getKernelType in case when custom kernel has been set */CUSTOM=-1,/** Linear kernel. No mapping is done, linear discrimination (or regression) isdone in the original feature space. It is the fastest option. \f$K(x_i, x_j) = x_i^T x_j\f$. */LINEAR=0,/** Polynomial kernel:\f$K(x_i, x_j) = (\gamma x_i^T x_j + coef0)^{degree}, \gamma > 0\f$. */POLY=1,/** Radial basis function (RBF), a good choice in most cases.\f$K(x_i, x_j) = e^{-\gamma ||x_i - x_j||^2}, \gamma > 0\f$. */RBF=2,/** Sigmoid kernel: \f$K(x_i, x_j) = \tanh(\gamma x_i^T x_j + coef0)\f$. */SIGMOID=3,/** Exponential Chi2 kernel, similar to the RBF kernel:\f$K(x_i, x_j) = e^{-\gamma \chi^2(x_i,x_j)}, \chi^2(x_i,x_j) = (x_i-x_j)^2/(x_i+x_j), \gamma > 0\f$. */CHI2=4,/** Histogram intersection kernel. A fast kernel. \f$K(x_i, x_j) = min(x_i,x_j)\f$. */INTER=5};

对应参数:

degree:内核函数(POLY)的参数degree。

gamma:内核函数(POLY/ RBF/ SIGMOID)的参数

coef0:内核函数(POLY/ SIGMOID)的参数coef0。

关于svm类型的:

C_SVC是默认类型:C类支撑向量分类机。 n类分组 (n≥2),容许用异常值处罚因子C进行不完全分类。

    enum Types {C_SVC=100,NU_SVC=101,ONE_CLASS=102,EPS_SVR=103,NU_SVR=104};

对应参数:

Cvalue:SVM类型(C_SVC/ EPS_SVR/ NU_SVR)的参数C。

nu:SVM类型(NU_SVC/ ONE_CLASS/ NU_SVR)的参数 。

p:SVM类型(EPS_SVR)的参数。

class_weights:C_SVC中的可选权重,赋给指定的类,乘以C今后变成 。所以这些权重影响不合类此外错误分类处罚项。权重越大,某一类此外误分类数据的处罚项就越大。

term_crit:SVM的迭代练习过程的中断前提,解决项目组受束缚二次最优题目。您可以指定的公差和/或最大迭代次数。


// SVM.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include "pch.h"
#include <iostream>
#include <opencv2\opencv.hpp>using namespace cv;
using namespace cv::ml;int train_sample_nums = 200;int main()
{/******************数据集制作***************************/Mat trainData(train_sample_nums, 2, CV_32FC1);Mat trainClassess(train_sample_nums, 1, CV_32SC1);               //注意标签的格式,有符号//创建可视化图像Mat img(500, 500, CV_8UC3, Scalar::all(0));//样本点Mat sample(1, 2, CV_32FC1);Mat trainData1, trainData2, trainClasses1, trainClasses2;RNG rng = RNG(-1);//生成均值为(200,200),方差为(40,40)的随机数据trainData1 = trainData.rowRange(0, train_sample_nums / 2);rng.fill(trainData1, CV_RAND_NORMAL, Scalar(100, 100), Scalar(40, 40));trainData2 = trainData.rowRange(train_sample_nums / 2, train_sample_nums);rng.fill(trainData2, CV_RAND_NORMAL, Scalar(300, 300), Scalar(40, 40));//trainClasses1和trainClassess的前100行绑定trainClasses1 = trainClassess.rowRange(0, train_sample_nums / 2);trainClasses1 = Scalar::all(1);trainClasses2 = trainClassess.rowRange(train_sample_nums / 2, train_sample_nums);trainClasses2 = Scalar::all(-1);/*****************训练********************/cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::create();svm->setType(cv::ml::SVM::C_SVC);svm->setC(1.0);svm->setKernel(cv::ml::SVM::POLY);svm->setGamma(1.0);svm->setDegree(2.0);svm->setCoef0(0.0);svm->setTermCriteria(cv::TermCriteria(cv::TermCriteria::MAX_ITER, 500, 1e-6));// cv::ml::SVM::setTermCriteria(CV_TERMCRIT_ITER, 500, 1e-6); cv::Ptr<TrainData> TrainData = TrainData::create(trainData, SampleTypes::ROW_SAMPLE, trainClassess);//svm->train(trainData, cv::ml::ROW_SAMPLE, trainClassess);svm->train(TrainData);for (int i = 0; i < img.rows; ++i){for (int j = 0; j < img.cols; ++j){Mat sampleMat = (Mat_<float>(1, 2) << i, j);float response = svm->predict(sampleMat);if (response == 1){img.at<Vec3b>(i, j) = Vec3b(0, 160, 0);}else if (response == -1){img.at<Vec3b>(i, j) = Vec3b(0, 0, 160);}}}for (int i = 0; i < train_sample_nums / 2; i++){Point pt;pt.x = round(trainData1.at<float>(i, 0));pt.y = round(trainData1.at<float>(i, 1));circle(img, pt, 1, Scalar(0, 255, 255));pt.x = round(trainData2.at<float>(i, 0));pt.y = round(trainData2.at<float>(i, 1));circle(img, pt, 1, Scalar(255, 255, 0));}int thickness = 1;int lineType = 8;Mat image(img);Mat sv = svm->getSupportVectors();for (int i = 0; i < sv.rows; i++){const float* v = sv.ptr<float>(i);circle(image, cv::Point((int)v[0], (int)v[1]), 6, Scalar(255, 0, 0), thickness, lineType);}imshow("img", img);imshow("image", image);waitKey(0);
}

SVM图像分割:待填坑

OpenCV - SVM算法原理实现以及SVM图像分割相关推荐

  1. 支持向量机SVM算法原理及应用(R)

    支持向量机SVM算法原理及应用(R) 2016年08月17日 16:37:25 阅读数:22292更多 个人分类: 数据挖掘实战应用 版权声明:本文为博主原创文章,转载请注明来源. https://b ...

  2. 支持向量机SVM算法原理笔记2

    上篇博客介绍了当样本集是线性可分情况下的SVM算法原理.接下来介绍不存在一个划分超平面可以正确分类的问题,比如说"异或问题". 对于此类问题,可以将样本空间映射到更高维度空间,这样 ...

  3. 【收藏】SVM算法原理(适合有一定基础的人观看)

    SVM的英文全称是Support Vector Machines,我们叫它支持向量机.支持向量机是我们用于分类的一种算法.让我们以一个小故事的形式,开启我们的SVM之旅吧. 在很久以前的情人节,一位大 ...

  4. 小白学习机器学习---第六章:SVM算法原理(1)

    SVM的英文全称是Support Vector Machines,我们叫它支持向量机.支持向量机是我们用于分类的一种算法.让我们以一个小故事的形式,开启我们的SVM之旅吧. 在很久以前的情人节,一位大 ...

  5. svm算法原理_机器学习——分类算法(1)

    一. K近邻 KNN算法的基本思想就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是 ...

  6. 最容易理解的SVM算法原理

    基于最大间隔分隔数据 1.1支持向量与超平面 SVM(Support Vector Mac)又称为支持向量机,是一种二分类的模型.当然如果进行修改之后也是可以用于多类别问题的分类.支持向量机可以分为线 ...

  7. Svm算法原理简单梳理

    这里首先简单介绍一下svm算法: (1)支持向量机(Support Vector Machine, SVM)是一种对数据进行二分类的广义线性分类器,其分类边界是对学习样本求解的最大间隔超平面. (2) ...

  8. Svm算法原理及实现

    Svm(support Vector Mac)又称为支持向量机,是一种二分类的模型.当然如果进行修改之后也是可以用于多类别问题的分类.支持向量机可以分为线性核非线性两大类.其主要思想为找到空间中的一个 ...

  9. SVM算法原理详解及python实现

    SVM算法 算法原理 对数据的要求 算法的优缺点 算法需要注意的点 算法实现(python)(待更.........) 算法原理 {wTx+b>0yi=1⟺y(xi)>0wTx+b< ...

最新文章

  1. linux下eclipse cdt主函数main参数值传递设置
  2. maxthon在浏览的页面上右键按住不动再按滚轮可以对打开的选项卡进行选择!
  3. 计算机中复合模板在哪,冷冲模CAD系统中装配模板的设计与复合算法研究-计算机软件专业论文.docx...
  4. c++ 获取系统时间_错过长假,我还有时间做近视手术么?
  5. java线程中yield(),sleep(),wait()区别详解
  6. 如何在 Mac 上更改 Safari 背景?
  7. 教程 海湾主机crt_海湾消防主机JB-QT-GST5000火灾报警控制器(联动型)与crt是怎么连接编公式的...
  8. 三点确定圆的半径_51CAE_新浪博客
  9. 拍照时光圈与景深控制
  10. systemctl重新加载_CentOS7利用systemctl添加自定义系统服务【转】
  11. 常见荧光染料修饰多种基团及其激发和 发射波长数据一览数据
  12. 2020 给你 8 个接私活的网站
  13. unigine 三维旋转矩阵(mat3,quat) scale translate 变换矩阵(mat4) 和forward up right 关系 normal binormal tangent
  14. 违反开源项目GPL协议,法院判罚了!国内首例
  15. 原生js:淘宝轮播图
  16. 难得五年来第一次暑假没有出海,即使最终没有逃过8月份的CPT外业
  17. c语言风光互补运行模式,基于风光互补特性的风电光热电站联合系统容量优化方法与流程...
  18. 飞天政务开放体系:数据为中心的云上政务平台与创新生态
  19. 疫情期间给女朋友敲段代码,给女朋友个小惊喜
  20. 教你免卷下载百度文库的文档!!!

热门文章

  1. linux kernel pwn学习之hijack prctl
  2. html怎么调用python,使用HTML调用python函数
  3. 华为 中间系统IS-IS协议基础配置
  4. iOS10.3新特性图文介绍
  5. (Windows,ten2.0)python0-9数字识别系统搭建(MNIST数据集)
  6. r7 3700u和i5 8250u的区别哪个好
  7. 知道了域名怎么查备案号
  8. 已解决-word粘贴时快捷键实现只保留文本
  9. java 包名、类名命名规则
  10. java中国象棋绝杀算法_象棋30种绝杀秘籍大全,GIF图解灵活运用可百战百胜,绝无敌手...