帮忙为量机,OpenCV

  机器上是出于 模型 + 策略 + 算法
构成的,构建平栽机器上模式(例如,帮忙为量机),就是具体去确定这三独元素。

  机器上是由 模型 + 策略 + 算法
构成的,构建平种植机器上道
(例如,帮忙于量机),就是现实去确定就三单元素。

1  匡助为量机

  协助为量机,简称 SVM (Support Vector Machine),是千篇一律种次划分分类型。

1  帮忙于量机

  匡助于量机,简称 SVM (Support Vector Machine),是同样种植次细分分类型。

1) 模型 (model)

    定义在特色空间达到之,一种间隔 (margin) 最酷的,线性分类器 (linear
classifier)

1) 模型 (model)

    定义在特色空间上之,一栽间隔 (margin) 最可怜之,线性分类器 (linear
classifier)

2) 策略 (strategy)

    使间隔最大化,可转化为求解凸二赖规划的题目。

2) 策略 (strategy)

    使间隔最大化,可转化为求解凸二不良设计的题目。

3) 算法 (algorithm)

    求解凸二不善设计的最优化算法。

 
供操练之样本数只是分为三类:第一类是线性可划分的,第二好像是近似线性可分割的,第三看似是线性不可分的。

  三栽样本数对应之 SVM 分别吗:线性可分割 (硬间隔最大化),线性
(软间隔最大化),非线性 (核技巧 + 软间隔最大化)。

  为了便于起见,下文提到的向量机 或 SVM,都是赖线性可分割补助于量机

 

3) 算法 (algorithm)

    求解凸二涂鸦设计之太优化算法。

 
供磨练的样本数量只是分为三类:第一近乎是线性可划分的,第二接近是近似线性可分割的,第三类似是线性不可分的。

  两种植样本数量对应之 SVM 分别吗:线性可划分 (硬间隔最大化),线性
(软间隔最大化),非线性 (核技巧 + 软间隔最大化)。

  为了便利起见,下文提到的向量机 或 SVM,都是乘线性可分割襄助为量机

 

2  基本概念

2  基本概念

2.1  超平面 (hyperplane)

  n 维欧式空间被,余维度等于 1 (也即 n-1 维) 的丝性子空间,称为超平面。

 
超平面在二维空间受到凡是直线,在三维空间被凡面,可用来相隔数据。正如图所示,超平面
(直线) 能将两类不同之数据 (圆点和方点) 分隔开来。

  如若以数据点记为 x (n 维向量),则领先平面的方程为 $\ f(x) = \beta_{0}

  • \beta^{T} x = 0\; $,其中,$\beta $ 为权重为量 (有的书称为
    “法向量”)

      澳门网上娱乐 1             
澳门网上娱乐 2

  解释:右图中 $\beta^{*}$ 为超平面 (黑色直线) 的单位法向量 $\
\beta^{*} = \dfrac{\beta}{||\beta||}$,平面中任意点 x
到抢先平面的离呢 $\ r = \dfrac{|\beta_{0} + \beta^{T} x|}
{||\beta||}$

  又就: 平面坐标中,一个接触 $\;(x_{0}, y_{0})\;$到直线$\;(Ax + By +
C = 0)\;$ 的距离呢 $\; d = \dfrac{Ax_{0} + By_{0} + C}{\sqrt{A^{2}

  • B^{2}}} $

2.1  超平面 (hyperplane)

  n 维欧式空间受到,余维度等于 1 (也就 n-1 维) 的丝性子空间,称为超平面。

 
超平面在二维空间中是直线,在三维空间受到凡是平面,可用来相隔数据。如下图所示,超平面
(直线) 能将两类不同之数据 (圆点和方点) 分隔开来。

  假设以数据点记为 x (n 维向量),则超过平面的方程为 $\ f(x) = \beta_澳门网上娱乐,{0}

  • \beta^{T} x = 0\; $,其中,$\beta $ 为权重为量 (有的书称为
    “法向量”)

      澳门网上娱乐 3             
澳门网上娱乐 4

  解释:右图中 $\beta^{*}$ 为超平面 (青色直线) 的单位法向量 $\
\beta^{*} = \dfrac{\beta}{||\beta||}$,平面中任意点 x
到跨平面的离开为 $\ r = \dfrac{|\beta_{0} + \beta^{T} x|}
{||\beta||}$

  又把: 平面坐标中,一个接触 $\;(x_{0}, y_{0})\;$到直线$\;(Ax + By +
C = 0)\;$ 的相距为 $\; d = \dfrac{Ax_{0} + By_{0} + C}{\sqrt{A^{2}

  • B^{2}}} $

2.2  协理为量 (support vector)

  假若博输出 y 分别吗 +1 同 -1,代表个别种植不同类型,则于 x,其相应的
f(x) 有三栽可能取值:

  1) 当位于超平面上时 (也就是图被之直线上),$ f(x) = \beta_{0} +
\beta^{T} x = 0 $

  2) 当位于超平面左边时, $f(x) = \beta_{0} + \beta^{T} x \leq -1$

  3) 当位于超平面左边时, $f(x) = \beta_{0} + \beta^{T} x \geq +1$

  假诺有一个超平面,能将 n
个样本数科学的分类,则于随意一个样书数据$\;(x_{i},
y_{i})$,满意如下自律原则

  $\quad y_{i}(\beta^{T} x_{i} + \beta_{0}) \geq 1 , i = 1, 2,
…, n $

       澳门网上娱乐 5  

  如齐图所示,离超平面近日底老六个样本点,使得 2) 和 3)
中的等号起,它们称为 “辅助向量”

2.2  辅助于量 (support vector)

  假如获输出 y 分别吗 +1 及 -1,代表个别种不同档次,则对此 x,其对应之
f(x) 有两种或取值:

  1) 当位于超平面上时 (也即图中之直线上),$ f(x) = \beta_{0} +
\beta^{T} x = 0 $

  2) 当位于超平面左侧时, $f(x) = \beta_{0} + \beta^{T} x \leq -1$

  3) 当位于超平面左边时, $f(x) = \beta_{0} + \beta^{T} x \geq +1$

  如倘使一个超平面,能拿 n
个样本数量是的归类,则对此自由一个样本数据$\;(x_{i},
y_{i})$,满足如下格原则

  $\quad y_{i}(\beta^{T} x_{i} + \beta_{0}) \geq 1 , i = 1, 2,
…, n $

       澳门网上娱乐 6  

  如达到图所示,相距超平面近期的老三独样本点,使得 2) 和 3)
中之抵号创设,它们称为 “协理向量”

2.3  几哪间隔 (geometric margin)

  因为匡助向量使得 2) 和 3) 的对等号起,所以其到超平面的离开:

$\quad r = \dfrac{|\beta_{0} + \beta^{T} x|} {||\beta||} =
\dfrac{1}{||\beta||}$

  两单例外门类之支撑于量 (分别取值为 +1 及 -1),到超平面的距离的与也:

$\quad r^{‘} = \dfrac{2}{||\beta||}\;$,$r^{‘}\;$称为 “几何地间隔”
(geometric margin)

  一个沾去超平面的远近,可用来表示分类结果的正确性和确实信度。

  直观上看,超平面越是接近两近似样本数的中央间
(也即使有限接近数据点到超平面的距离越远),则分类结果的不利和真正信度就越来越强。

    澳门网上娱乐 7

2.3  几哪间隔 (geometric margin)

  因为辅助向量使得 2) 和 3) 的对等号创制,所以其到超平面的离:

$\quad r = \dfrac{|\beta_{0} + \beta^{T} x|} {||\beta||} =
\dfrac{1}{||\beta||}$

  七只例外系列之支撑为量 (分别取值为 +1 同 -1),到过平面的距离的同为:

$\quad r^{‘} = \dfrac{2}{||\beta||}\;$,$r^{‘}\;$称为 “几哪间隔”
(geometric margin)

  一个沾距离超平面的远近,可用来代表分类结果的不利和真正信度。

  直观上看,超平面越是接近两接近样本数量的中间间
(也即使有限类似数据点到超过平面的离开越远),则分类结果的不错和真信度就越来越强。

    澳门网上娱乐 8

2.4  学习算法

  SVM 的上学到底法 (或如太丰裕间隔法),就是基于所为的范本数,去追寻到具有
“最老间距” 的超平面,将不同品种之范本分隔开来。

  也就是,在满足 “约束原则” 的前提下,使得 $r^{‘}$ 的价值最可怜:

  $\quad \max \limits_{\beta,\; \beta_{0}}
\dfrac{2}{||\beta||} \quad subject\;to \quad y_{i}(\beta^{T}
x_{i} + \beta_{0}) \geq 1 , i = 1, 2, …, n $

  再或者,最大化 $r^{‘}$,等价于极端小化 $||\beta||^{2}$,如下所示:

  $\quad \min \limits_{\beta,\;\beta_{0}} \dfrac{1}{2}
||\beta||^{2} \quad subject \; to \quad y_{i} (\beta^{T} x_{i} +
\beta_{0}) \geq 1 , i = 1, 2, …, n $

 

2.4  学习算法

  SVM 的上到底法 (或称最酷间隔法),就是依照所被的样本数量,去寻找到所有
“最要命间隔” 的超平面,将不同类型的样书分隔开来。

  也便,在满意 “约束规范” 的前提下,使得 $r^{‘}$ 的值最可怜:

  $\quad \max \limits_{\beta,\; \beta_{0}}
\dfrac{2}{||\beta||} \quad subject\;to \quad y_{i}(\beta^{T}
x_{i} + \beta_{0}) \geq 1 , i = 1, 2, …, n $

  再或者,最大化 $r^{‘}$,等价于最小化 $||\beta||^{2}$,如下所示:

  $\quad \min \limits_{\beta,\;\beta_{0}} \dfrac{1}{2}
||\beta||^{2} \quad subject \; to \quad y_{i} (\beta^{T} x_{i} +
\beta_{0}) \geq 1 , i = 1, 2, …, n $

 

3  OpenCV 函数

  OpenCV 中 SVM 的实现是因 libsvm 的,其焦点的长河为:创造 SVM 模型
–> 设置相关参数 –> 样本数磨炼 –> 预测

3  OpenCV 函数

  OpenCV 中 SVM 的实现是依据 libsvm 的,其主导的进程也:创立 SVM 模型
–> 设置相关参数 –> 样本数磨练 –> 预测

1) 创立模型

static Ptr<SVM> cv::ml::SVM::create ( );  // 创建一个空模型

1) 创立模型

static Ptr<SVM> cv::ml::SVM::create ( );  // 创建一个空模型

 2) 设置参数

virtual void cv::ml::SVM::setType (int val);  // 设置 SVM 的类型,默认为 SVM::C_SVC 

virtual void cv::ml::SVM::setKernel (int kernelType); // 设置核函数类型,本文为线性核函数,设为 SVM::LINEAR

virtual void cv::ml::SVM::setTermCriteria (const cv::TermCriteria & val); // 设置迭代终止准则

// type,准则类型; maxCount,最大迭代次数;epsilo,目标精度
cv::TermCriteria::TermCriteria(int type, int maxCount, double epsilon);       

 2) 设置参数

virtual void cv::ml::SVM::setType (int val);  // 设置 SVM 的类型,默认为 SVM::C_SVC 

virtual void cv::ml::SVM::setKernel (int kernelType); // 设置核函数类型,本文为线性核函数,设为 SVM::LINEAR

virtual void cv::ml::SVM::setTermCriteria (const cv::TermCriteria & val); // 设置迭代终止准则

// type,准则类型; maxCount,最大迭代次数;epsilo,目标精度
cv::TermCriteria::TermCriteria(int type, int maxCount, double epsilon);       

3) 训练 (train)

virtual bool cv::ml::StatModel::train (
   InputArray  samples,   // 训练样本
    int        layout,   // 训练样本为 “行样本” ROW_SAMPLE 或 “列样本” COL_SAMPLE
    InputArray    responses // 对应样本数据的分类结果
)     

3) 训练 (train)

virtual bool cv::ml::StatModel::train (
   InputArray  samples,   // 训练样本
    int        layout,   // 训练样本为 “行样本” ROW_SAMPLE 或 “列样本” COL_SAMPLE
    InputArray    responses // 对应样本数据的分类结果
)     

4) 预测 (predict)

  用来预测一个新样本的响应,各样参数如下:

// samples,输入的样本书数据;results,输出矩阵,默认不输出;flags,标识,默认为 0

virtual float cv::ml::StatModel::predict(InputArray samples, OutputArray results=noArray(),int flags=0) const;  

 

4) 预测 (predict)

  用来预测一个初样本的响应,各种参数如下:

// samples,输入的样本书数据;results,输出矩阵,默认不输出;flags,标识,默认为 0

virtual float cv::ml::StatModel::predict(InputArray samples, OutputArray results=noArray(),int flags=0) const;  

 

4  代码示例

  下面是 OpenCV 3.2 中的合法例程,更改了锻炼样本数据

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include "opencv2/imgcodecs.hpp"
#include <opencv2/highgui.hpp>
#include <opencv2/ml.hpp>

using namespace cv;
using namespace cv::ml;

int main()
{
    // 512 x 512 零矩阵
    int width = 512, height = 512;
    Mat image = Mat::zeros(height, width, CV_8UC3);

    // 训练样本
    float trainingData[6][2] = { { 500, 60 },{ 245, 40 },{ 480, 250 },{ 160, 380 },{400, 25},{55, 400} };
    int labels[6] = {-1, 1, 1, 1,-1,1};  // 每个样本数据对应的输出,因为是二分模型,所以输出为 +1 或者 -1
    Mat trainingDataMat(6, 2, CV_32FC1, trainingData);
    Mat labelsMat(6, 1, CV_32SC1, labels);

    // 训练 SVM
    Ptr<SVM> svm = SVM::create();
    svm->setType(SVM::C_SVC);
    svm->setKernel(SVM::LINEAR);
    svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6));
    svm->train(trainingDataMat, ROW_SAMPLE, labelsMat);

    // 显示二分分类的结果
    Vec3b green(0, 255, 0), blue(255, 0, 0);
    for (int i = 0; i < image.rows; ++i)
        for (int j = 0; j < image.cols; ++j)
        {
            Mat sampleMat = (Mat_<float>(1, 2) << j, i);
            float response = svm->predict(sampleMat);
            if (response == 1)
                image.at<Vec3b>(i, j) = blue;
            else if (response == -1)
                image.at<Vec3b>(i, j) = green;
        }

    // 画出训练样本数据
    int thickness = -1;
    int lineType = 8;
    circle(image, Point(500, 60), 5, Scalar(0, 0, 0), thickness, lineType);
    circle(image, Point(245, 40), 5, Scalar(255, 255, 255), thickness, lineType);
    circle(image, Point(480, 250), 5, Scalar(255, 255, 255), thickness, lineType);
    circle(image, Point(160, 380), 5, Scalar(0, 0, 255), thickness, lineType);
    circle(image, Point(400, 25), 5, Scalar(255, 255, 255), thickness, lineType);
    circle(image, Point(55, 400), 5, Scalar(0, 0, 255), thickness, lineType);

    // 显示出支持向量
    thickness = 2;
    lineType = 8;
    Mat sv = svm->getUncompressedSupportVectors();
    for (int i = 0; i < sv.rows; ++i)
    {
        const float* v = sv.ptr<float>(i);
        circle(image, Point((int)v[0], (int)v[1]), 6, Scalar(128, 128, 128), thickness, lineType);
    }

    imwrite("result.png", image);        // 保存训练的结果
    imshow("SVM Simple Example", image); 
    waitKey(0);
}

  OpenCV 3.2 版本中拔取了一个新的函数,来获取襄助向量,即 getUncompressedSupportVectors()

  而 OpenCV 3.0 中,获取协助向量的函数为 getSupportVectors(),但当内核设为 SVM::LINEAR
时,该函数并无可以博取援助向量,这是 3.0 版本的欠缺。

  运行结果假如下图所出示,超平面附近的老三单粉色匡白色圆点,便是所谓的
“帮助向量”。

      澳门网上娱乐 9

   

4  代码示例

  下面是 OpenCV 3.2 中的官例程,更改了训练样本数据

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include "opencv2/imgcodecs.hpp"
#include <opencv2/highgui.hpp>
#include <opencv2/ml.hpp>

using namespace cv;
using namespace cv::ml;

int main()
{
    // 512 x 512 零矩阵
    int width = 512, height = 512;
    Mat image = Mat::zeros(height, width, CV_8UC3);

    // 训练样本
    float trainingData[6][2] = { { 500, 60 },{ 245, 40 },{ 480, 250 },{ 160, 380 },{400, 25},{55, 400} };
    int labels[6] = {-1, 1, 1, 1,-1,1};  // 每个样本数据对应的输出,因为是二分模型,所以输出为 +1 或者 -1
    Mat trainingDataMat(6, 2, CV_32FC1, trainingData);
    Mat labelsMat(6, 1, CV_32SC1, labels);

    // 训练 SVM
    Ptr<SVM> svm = SVM::create();
    svm->setType(SVM::C_SVC);
    svm->setKernel(SVM::LINEAR);
    svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6));
    svm->train(trainingDataMat, ROW_SAMPLE, labelsMat);

    // 显示二分分类的结果
    Vec3b green(0, 255, 0), blue(255, 0, 0);
    for (int i = 0; i < image.rows; ++i)
        for (int j = 0; j < image.cols; ++j)
        {
            Mat sampleMat = (Mat_<float>(1, 2) << j, i);
            float response = svm->predict(sampleMat);
            if (response == 1)
                image.at<Vec3b>(i, j) = blue;
            else if (response == -1)
                image.at<Vec3b>(i, j) = green;
        }

    // 画出训练样本数据
    int thickness = -1;
    int lineType = 8;
    circle(image, Point(500, 60), 5, Scalar(0, 0, 0), thickness, lineType);
    circle(image, Point(245, 40), 5, Scalar(255, 255, 255), thickness, lineType);
    circle(image, Point(480, 250), 5, Scalar(255, 255, 255), thickness, lineType);
    circle(image, Point(160, 380), 5, Scalar(0, 0, 255), thickness, lineType);
    circle(image, Point(400, 25), 5, Scalar(255, 255, 255), thickness, lineType);
    circle(image, Point(55, 400), 5, Scalar(0, 0, 255), thickness, lineType);

    // 显示出支持向量
    thickness = 2;
    lineType = 8;
    Mat sv = svm->getUncompressedSupportVectors();
    for (int i = 0; i < sv.rows; ++i)
    {
        const float* v = sv.ptr<float>(i);
        circle(image, Point((int)v[0], (int)v[1]), 6, Scalar(128, 128, 128), thickness, lineType);
    }

    imwrite("result.png", image);        // 保存训练的结果
    imshow("SVM Simple Example", image); 
    waitKey(0);
}

  OpenCV 3.2 版本被应用了一个初的函数,来赢得襄助向量,即 getUncompressedSupportVectors()

  而 OpenCV 3.0 中,获取匡助向量的函数为 getSupportVectors(),但当内核设为 SVM::LINEAR
时,该函数并无可以博得辅助向量,这是 3.0 版本的欠缺。

  运行结果使下图所出示,超平面附近的老六个黄色匡白色圆点,便是所谓的
“扶助向量”。

      澳门网上娱乐 10

   

参考资料:

  <机器上> 周志军  第6段

  <总结上格局> 李航  第7章

  <The Elements of Statistical Learning_2nd>  ch 4.5 , ch 12

  “援助为量机体系“  pluskid

  OpenCV 3.2  Tutorials — Machine Learning (ml
module)
 
— Introduction to Support Vector
Machines

  “LIBSVM — A Library for Support Vector
Machines”

 

参考资料:

  <机器上> 周志军  第6节

  <总计上情势> 李航  第7章

  <The Elements of Statistical Learning_2nd>  ch 4.5 , ch 12

  “帮忙于量机序列“  pluskid

  OpenCV 3.2  Tutorials — Machine Learning (ml
module)
 
— Introduction to Support Vector
Machines

  “LIBSVM — A Library for Support Vector
Machines”

 

相关文章