《泰坦尼克号》都明白,杰克与露丝的爱恋,既美好而伤心,在拘留录像之时光,不知而是不是想过如此一个题材:在【泰坦尼克号】沉船事故负,什么样的人重新便于在下去吗?

  机器上是由 模型 + 策略 + 算法
构成的,构建平种机器上方式
(例如,支持为量机),就是现实去确定这三单元素。

当同样称呼程序员,我们可以通过数据来预测船员及乘客的好还景。

1  支持为量机

  支持于量机,简称 SVM (Support Vector Machine),是同等栽次瓜分分类型。

实验楼上起同一帮派课程:【利用随意森林算法预测 Titanic
乘客生还概率】,就是使你使用机械上之计来预测泰坦尼克号上的乘客生还概率。

1) 模型 (model)

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

要是您针对机器上感兴趣,那么推荐是类型课程,该课程将解决分类中之 2
分类任务,即类别只有正反两好像(生还还是死亡)。课程包括数据清洗和可视化、模型训练和评估,以及自由森林分类器调参等内容。

2) 策略 (strategy)

    使间隔最大化,可转化为求解凸二不良规划的问题。

课程内容:

欠科目并分为3单实验,具体如下:

3) 算法 (algorithm)

    求解凸二次等设计之尽优化算法。

 
供训练的范本数而分为三类:第一近似是线性可分割的,第二接近是近似线性可划分的,第三类似是线性不可分的。

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

  为了好起见,下文提到的向量机 或 SVM,都是据线性可分割支持为量机

 

1、数据清洗和可视化

尝试内容:

数清洗是多少解析着酷重大之同一组成部分,也不过烦,做好当下同样步用大量底经验及耐心。这门课程中,我以和大家齐声,一步步形成这项工作。该试验上数据清洗的基本思路以及具体操作,同时,练习使用
Pandas 数据解析工具、Seaborn 统计分析可视化工具。

试知识点:

  • 距离群点分析
  • 缺少失值处理
  • 偏态分布数据处理

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}}} $

3、随机森林分类器参数调节

试内容:

拖欠试验上并学习之即兴森林算法,参数调节,并解决及亦然省实验当中遇到的过拟合问题。我们用延续以
Python sklean 机器上工具。

试知识点:

  • 决策树
  • 并学习
  • 随便森林算法
  • 参数调节

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 $

       图片 3  

  如达到图所示,离超平面最近底老三只样本点,使得 2) 和 3)
中的顶号起,它们称为 “支持向量”

最后

倘你想掌握【泰坦尼克号】上哪类人再次易于在下来,亦要对机械上感兴趣,那么点击【利用任意森林算法预测
Titanic
乘客生还概率】即可开始修,通过自己之学习,通过数量来评估出啦类人再度爱在下去。

  • 只要你针对机器上感兴趣,你也可以点击【机器上工程师】学习路径,带您通过大气的实战操作掌握机器上。

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)

  一个沾去超平面的远近,可用来代表分类结果的是和实在信度。

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

    图片 4

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 模型
–> 设置相关参数 –> 样本数训练 –> 预测

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);       

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  代码示例

  下面是 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 版本的瑕疵。

  运行结果使下图所著,超平面附近的老三单灰色匡白色圆点,便是所谓的
“支持向量”。

      图片 5

   

参考资料:

  <机器上> 周志军  第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”