主要内容

二值分类的支持向量机

理解支持向量机

分离数据

当您的数据正好有两个类时,您可以使用支持向量机(SVM)。支持向量机通过寻找最佳超平面将一个类的所有数据点与另一个类的数据点分离开来,从而对数据进行分类。的最好的支持向量机的超平面是指最大的超平面保证金在两个班之间。裕度是指平行于没有内部数据点的超平面的平板的最大宽度。

支持向量是离分离超平面最近的数据点;这些点在板坯的边界上。下图说明了这些定义,+表示类型1的数据点,-表示类型- 1的数据点。

数学公式:原始。这一讨论紧随哈斯蒂、蒂布希拉尼和弗里德曼之后展开[1]还有克里斯汀尼和肖·泰勒[2]

用于训练的数据是一组点(向量)xj以及它们的分类yj.对于一些维度d,xjRd,yj=±1.超平面的方程是

f x x β + b 0

在哪里βRd而且b是实数。

下面的问题定义了最好的分离超平面(即决策边界)。找到β而且b这最小化| |β||使所有数据点(xjyj),

y j f x j 1.

支持向量是xj在边界上,那些 y j f x j 1.

为了数学上的方便,这个问题通常被给出为最小化的等价问题 β .这是一个二次规划问题。最优解 β b 启用向量分类z如下:

z 标志 z β + b 标志 f z

f z 分类分表示距离z就是从决定边界出发。

数学公式:双。对偶二次规划问题的求解在计算上比较简单。为了得到对偶,取正拉格朗日乘子αj乘以每个约束,减去目标函数:

l P 1 2 β β j α j y j x j β + b 1

的静止点lPβ而且b.设置渐变lP到0,你得到

β j α j y j x j 0 j α j y j (1)

替换成lP,你得到了双lD

l D j α j 1 2 j k α j α k y j y k x j x k

求最大值αj≥0.一般来说,许多αj最大值为0。非零的αj在对偶问题的解中定义超平面,如方程1,这使β作为总和αjyjxj.数据点xj对应于零αj支持向量

的导数lD关于非零的αj在最优条件下为0。这给了

y j f x j 1 0.

特别地,它给出了的值b在溶液中,取任意j与非零αj

对偶是一个标准的二次规划问题。例如,优化工具箱™quadprog(优化工具箱)求解器可以解决这类问题。

不可分的数据

你的数据可能不允许分离的超平面。在这种情况下,SVM可以使用软边缘这意味着它是一个分隔了许多但不是所有数据点的超平面。

软边有两种标准公式。两者都涉及添加松弛变量ξj和一个惩罚参数C

  • l1规范的问题是:

    最小值 β b ξ 1 2 β β + C j ξ j

    这样

    y j f x j 1 ξ j ξ j 0.

    l1-norm表示使用ξj作为松弛变量而不是它们的平方。三个求解器选项SMOISDA,L1QPfitcsvm最小化l1规范的问题。

  • l2规范的问题是:

    最小值 β b ξ 1 2 β β + C j ξ j 2

    受同样的约束。

在这些公式中,你可以看到它在增加C将更多的权重放在松弛变量上ξj,这意味着优化尝试在类之间进行更严格的分离。同样,减少C越接近0,错误分类就越不重要。

数学公式:双。为了更容易的计算,考虑l1软边际公式存在双重问题。使用拉格朗日乘数法μj的最小化函数l1规范的问题是:

l P 1 2 β β + C j ξ j j α j y f x j 1 ξ j j μ j ξ j

的静止点lPβb和积极的ξj.设置渐变lP到0,你得到

β j α j y j x j j α j y j 0 α j C μ j α j μ j ξ j 0.

这些方程直接导致对偶公式:

马克斯 α j α j 1 2 j k α j α k y j y k x j x k

受限于

j y j α j 0 0 α j C

最后一组不等式,0≤αjC显示,为什么C有时被称为箱约束C保持拉格朗日乘子的允许值αj在“盒子”中,一个有界的区域。

的梯度方程b给出了解决方案b根据非零的集合αj,对应于支持向量。

你可以写出并解对偶l2-范数问题。详情请参见Christianini和Shawe-Taylor[2]第六章。

fitcsvm实现。两个对偶软边际问题都是二次规划问题。在内部,fitcsvm有几种不同的算法来解决问题。

  • 对于单类或二元分类,如果没有在数据中设置预期异常值的一小部分(参见OutlierFraction),则默认求解器为顺序最小优化(SMO)。SMO通过一系列两点极小化来最小化单范数问题。在优化过程中,SMO尊重线性约束 α y 0 并显式地将偏差项包含在模型中。SMO相对较快。有关SMO的详细信息,请参见[3]

  • 对于二进制分类,如果在数据中设置预期异常值的一小部分,则默认求解器是迭代单数据算法(Iterative Single data Algorithm)。和SMO一样,ISDA解决了单一规范问题。与SMO不同的是,ISDA通过一点最小值的级数进行最小化,不考虑线性约束,也不显式地在模型中包含偏差项。有关ISDA的更多详细信息,请参见[4]

  • 对于单类或二进制分类,并且如果您拥有优化工具箱许可证,则可以选择使用quadprog(优化工具箱)解决单范数问题。quadprog使用大量的内存,但解决二次程序的高度精度。有关更多细节,请参见二次规划的定义(优化工具箱)

带核的非线性变换

有些二元分类问题没有简单的超平面作为有用的分离准则。对于这些问题,有一种数学方法的变体,它几乎保留了支持向量机分离超平面的所有简单性。

这种方法使用了复制核理论的这些结果:

  • 这里有一类函数Gx1x2)具有以下属性。这是一个线性空间年代和一个函数φ映射x年代这样

    Gx1x2) = <φx1),φx2) >。

    点积发生在空间中年代

  • 这类函数包括:

    • 多项式:对于某个正整数p

      Gx1x2) = (1 +x1x2p

    • 径向基函数(高斯):

      Gx1x2) = exp(∥x1- - - - - -x2)∥2).

    • 多层感知器或sigmoid(神经网络):用于正数p1一个负数p2

      Gx1x2) =双曲正切(p1x1x2+p2).

      请注意

核的数学方法依赖于超平面的计算方法。所有超平面分类的计算都只使用点积。2022世界杯八强谁会赢?因此,非线性核可以使用相同的计算和求解算法,并获得非线性的分类器。得到的分类器是某些空间中的超曲面年代,但是空间年代不需要识别或检查。

使用支持向量机

与任何监督学习模型一样,您首先训练支持向量机,然后交叉验证分类器。使用经过训练的机器对新数据进行分类(预测)。此外,为了获得满意的预测精度,可以使用各种支持向量机核函数,并且必须对核函数的参数进行优化。

训练SVM分类器

训练和交叉验证一个支持向量机分类器fitcsvm.最常见的语法是:

SVMModel = fitcsvm (X, Y,‘KernelFunction’,‘rbf’,……“标准化”,的确,“类名”,{‘negClass’,‘posClass});

输入:

  • X-预测器数据矩阵,其中每一行是一个观察,每列是一个预测器。

  • Y-类标签数组,每一行对应于中对应行的值XY可以是类别、字符或字符串数组、逻辑或数字向量,或者字符向量的单元格数组。

  • KernelFunction—默认值为“线性”对于两类学习,用超平面分离数据。的值“高斯”(或“rbf”)是单类学习的默认值,并指定使用高斯(或径向基函数)核。成功训练支持向量机分类器的一个重要步骤是选择合适的核函数。

  • 标准化-标志,指示软件是否应该在训练分类器之前对预测器进行标准化。

  • 一会—区分负类和正类,或指定在数据中包含哪些类。负类是第一个元素(或字符数组的第一行),例如,“negClass”,正类是第二个元素(或字符数组的行),例如,“posClass”一会必须与?相同的数据类型Y.指定类名是一种很好的实践,特别是在比较不同分类器的性能时。

得到的经过训练的模型(SVMModel)包含来自支持向量机算法的优化参数,使您能够对新数据进行分类。

有关可用于控制训练的更多名称-值对,请参阅fitcsvm参考页面。

用支持向量机分类器分类新数据

使用以下方法对新数据进行分类预测.使用经过训练的SVM分类器对新数据进行分类的语法(SVMModel)是:

(标签,分数)=预测(SVMModel newX);

由此产生的向量,标签中的每一行的分类X分数是一个n-by-2软评分矩阵。每一行对应于中的一行X这是一个新的观察结果。第一列包含被归为消极类的观察所得的分数,第二列包含被归为积极类的观察所得的分数。

要估计后验概率而不是分数,首先要通过经过训练的SVM分类器(SVMModel)fitPosterior,该函数将分数与后验概率转换函数拟合。的语法是:

ScoreSVMModel = fitPosterior (SVMModel, X, Y);

房地产ScoreTransform的分类器ScoreSVMModel包含最优变换函数。通过ScoreSVMModel预测.而不是返回分数,输出参数分数包含被分类为负数的观察的后验概率(第1列)分数)或正(第2栏)分数)类。

优化SVM分类器

使用“OptimizeHyperparameters”的名值对参数fitcsvm寻找最小交叉验证损失的参数值。符合条件的参数是“BoxConstraint”“KernelFunction”“KernelScale”“PolynomialOrder”,“标准化”.示例请参见使用贝叶斯优化优化分类器拟合.或者,您也可以使用bayesopt函数,如使用bayesopt优化交叉验证的分类器.的bayesopt功能允许更灵活的定制优化。您可以使用bayesopt函数来优化任何参数,包括使用时不适合优化的参数fitcsvm函数。

您也可以尝试根据以下方案手动调优分类器的参数:

  1. 将数据传递给fitcsvm,并设置名值对参数“KernelScale”、“汽车”.假设调用训练过的SVM模型SVMModel.该软件采用启发式方法选择内核规模。启发式过程使用子抽样。因此,为了再现结果,设置一个随机数种子使用rng在训练分类器之前。

  2. 通过将分类器传递给交叉验证crossval.默认情况下,软件进行10次交叉验证。

  3. 将交叉验证的SVM模型传递给kfoldLoss估计和保留分类误差。

  4. 重新训练SVM分类器,但调整“KernelScale”而且“BoxConstraint”名称-值对参数。

    • BoxConstraint-一个策略是尝试框约束参数的几何序列。例如,取11个值,从1 e-51 e5乘以10。增加BoxConstraint可能会减少支持向量的数量,但也可能增加训练时间。

    • KernelScale-一种策略是尝试RBF σ参数的几何序列在原始核尺度上缩放。通过:

      1. 检索原始内核尺度,例如:ks,使用点表示法:ks = SVMModel.KernelParameters.Scale

      2. 使用原核尺度因子作为新的核尺度因子。例如,乘ks通过11个值1 e-51 e5,增加了10倍。

选择产生最小分类错误的模型。您可能需要进一步细化参数,以获得更好的精度。从初始参数开始,执行另一个交叉验证步骤,这一次使用1.2因子。

使用高斯核训练支持向量机分类器

这个例子展示了如何生成一个具有高斯核函数的非线性分类器。首先,在二维的单位圆盘内生成一类点,在半径1到半径2的环空中生成另一类点。然后,基于高斯径向基函数核的数据生成分类器。默认的线性分类器显然不适合这个问题,因为模型是圆对称的。设置框约束参数为要做严格的分类,意思是不能错分类训练点。其他内核函数可能无法在这种严格的框约束下工作,因为它们可能无法提供严格的分类。尽管rbf分类器可以分离类,但结果可能被过度训练。

生成100个均匀分布在单元磁盘上的点。为此,生成一个半径r作为一个均匀随机变量的平方根,生成一个角度t统一在(0, 2 π ),并把点放在(rcos (t),rsin (t))。

rng (1);%的再现性r =√兰特(100 1));%半径t = 2 *π*兰德(100 1);%的角度Data1 = [r.*cos(t), r.*sin(t)];%点

生成100个均匀分布在环空中的点。半径与平方根成正比,这次是1到4均匀分布的平方根。

r2 =√3 *兰德(100 1)+ 1);%半径t2 = 2 *π*兰德(100 1);%的角度Data2 = [r2.*cos(t2), r2.*sin(t2)];%点

绘制点,并绘制半径为1和2的圆进行比较。

图;情节(data1 (: 1) data1 (:, 2),“r”。“MarkerSize”, 15)情节(data2(: 1)、data2 (:, 2),“b”。“MarkerSize”15) ezpolar (@ (x) 1); ezpolar (@ (x) 2);轴平等的持有

图中包含一个axes对象。axis对象包含6个类型为line、text的对象。

把数据放在一个矩阵里,做一个分类向量。

data3 = [data1; data2);theclass = 1 (200 1);theclass (1:10 0) = 1;

训练SVM分类器KernelFunction设置为“rbf”而且BoxConstraint设置为.绘制决策边界并标记支持向量。

训练SVM分类器成立这个,课程cl = fitcsvm (data3,“KernelFunction”“rbf”...“BoxConstraint”正,“类名”[1]);%在网格上预测分数d = 0.02;[x1Grid, x2Grid] = meshgrid (min (data3 (: 1)): d:马克斯(data3 (: 1)),...分钟(data3 (:, 2)): d:马克斯(data3 (:, 2)));xGrid = [x1Grid (:), x2Grid (:));[~,分数]=预测(cl, xGrid);绘制数据和决策边界图;h (1:2) = gscatter (data3 (: 1), data3 (:, 2), theclass,rb的“。”);持有ezpolar (@ (x) 1);h(3) =情节(data3 (cl.IsSupportVector, 1), data3 (cl.IsSupportVector, 2),“柯”);轮廓(x1Grid x2Grid,重塑(分数(:,2),大小(x1Grid)), [0 0),“k”);传奇(h, {' 1 '“+ 1”“支持向量”});轴平等的持有

图中包含一个axes对象。axis对象包含6个对象,类型分别为line、text和contour。这些对象表示-1,+1,支持向量。

fitcsvm生成一个接近半径为1的圆的分类器。差异是由随机训练数据造成的。

使用默认参数的训练会产生一个更接近循环的分类边界,但会对一些训练数据进行错误分类。的默认值BoxConstraint1,因此有更多的支持向量。

成立这个,课程cl2 = fitcsvm (data3,“KernelFunction”“rbf”);[~, scores2] =预测(这有点难度,xGrid);图;h (1:2) = gscatter (data3 (: 1), data3 (:, 2), theclass,rb的“。”);持有ezpolar (@ (x) 1);h(3) =情节(data3 (cl2.IsSupportVector, 1), data3 (cl2.IsSupportVector, 2),“柯”);轮廓(x1Grid x2Grid,重塑(scores2(:, 2),大小(x1Grid)), [0 0),“k”);传奇(h, {' 1 '“+ 1”“支持向量”});轴平等的持有

图中包含一个axes对象。axis对象包含6个对象,类型分别为line、text和contour。这些对象表示-1,+1,支持向量。

使用自定义核训练SVM分类器

这个例子展示了如何使用自定义核函数(例如sigmoid核)来训练SVM分类器,以及调整自定义核函数参数。

在单位圆内生成一组随机点。将第一和第三象限内的点标记为正类,将第二和第四象限内的点标记为负类。

rng (1);%的再现性n = 100;%每象限的点数r1 =√兰特(2 * n, 1));%随机半径t1 =[π/ 2 *兰德(n, 1);(π/ 2 *兰德(n - 1) +π)];Q1和Q3的随机角度X1 = [r1.*cos(t1) r1.*sin(t1)];% Polar-to-Cartesian转换r2 =√兰特(2 * n, 1));t2 =[π/ 2 *兰德(n, 1) +π/ 2;(π/ 2 *兰德(n, 1) -π/ 2)];% Q2和Q4的随机角度X2 = [r2.*cos(t2) r2.*sin(t2)];X = [X1;X2);%预测Y = 1 (4 * n, 1);Y(2*n + 1:end) = -1;%的标签

图数据。

图;gscatter (X (: 1) X (:, 2), Y);标题(“模拟数据散点图”

编写一个函数,接受特征空间中的两个矩阵作为输入,并使用sigmoid核将它们转换为Gram矩阵。

函数G = mysigmoid (U, V)% Sigmoid核函数,斜率为,截距为cγ= 1;c = 1;G = tanh(γ *U*V' + c);结束

将此代码保存为一个名为mysigmoid在您的MATLAB®路径上。

使用sigmoid核函数训练SVM分类器。将数据标准化是一种很好的做法。

Mdl1 = fitcsvm (X, Y,“KernelFunction”“mysigmoid”“标准化”,真正的);

Mdl1是一个ClassificationSVM包含估计参数的分类器。

绘制数据图,确定支持向量和决策边界。

在网格上计算分数d = 0.02;%网格的步长[x1Grid, x2Grid] = meshgrid (min (X (: 1)): d:马克斯(X (: 1))...min (X (:, 2)): d:马克斯(X (:, 2)));xGrid = [x1Grid (:), x2Grid (:));%的网格[~, scores1] =预测(Mdl1 xGrid);%的分数图;h (1:2) = gscatter (X (: 1), (:, 2), Y);持有h(3) =情节(X (Mdl1.IsSupportVector, 1),...X (Mdl1.IsSupportVector, 2),“柯”“MarkerSize”10);%的支持向量轮廓(x1Grid x2Grid,重塑(scores1(:, 2),大小(x1Grid)), [0 0),“k”);%的决策边界标题(“带有决策边界的散点图”)({传奇' 1 '' 1 '“支持向量”},“位置”“最佳”);持有

您可以调整内核参数,以试图改进决策边界的形状。这也可能降低样本内的误分类率,但是,您应该首先确定样本外的误分类率。

用10倍交叉验证确定样本外误分类率。

CVMdl1 = crossval (Mdl1);misclass1 = kfoldLoss (CVMdl1);misclass1
misclass1 = 0.1350

样本外误分类率为13.5%。

写另一个sigmoid函数,但是Setγ= 0.5;

函数G = mysigmoid2 (U, V)% Sigmoid核函数,斜率为,截距为cγ= 0.5;c = 1;G = tanh(γ *U*V' + c);结束

将此代码保存为一个名为mysigmoid2在您的MATLAB®路径上。

使用调整后的sigmoid核训练另一个SVM分类器。绘制数据和决策区域,确定样本外误分类率。

Mdl2 = fitcsvm (X, Y,“KernelFunction”“mysigmoid2”“标准化”,真正的);[~, scores2] =预测(Mdl2 xGrid);图;h (1:2) = gscatter (X (: 1), (:, 2), Y);持有h(3) =情节(X (Mdl2.IsSupportVector, 1),...X (Mdl2.IsSupportVector, 2),“柯”“MarkerSize”10);标题(“带有决策边界的散点图”)轮廓(x1Grid x2Grid,重塑(scores2(:, 2),大小(x1Grid)), [0 0),“k”);传奇({' 1 '' 1 '“支持向量”},“位置”“最佳”);持有CVMdl2 = crossval (Mdl2);misclass2 = kfoldLoss (CVMdl2);misclass2
misclass2 = 0.0450

经过s型斜率调整后,新的决策边界似乎提供了更好的样本内拟合,交叉验证率下降了66%以上。

使用贝叶斯优化优化分类器拟合

方法优化支持向量机分类fitcsvm函数和OptimizeHyperparameters名称-值参数。

生成数据

分类工作在点的位置从高斯混合模型。在统计学习的要素, Hastie, Tibshirani和Friedman(2009),第17页描述了该模型。该模型首先为“绿色”类生成10个基点,分布为均值(1,0)和单位方差的二维独立法线。它还为“红色”类生成10个基点,分布为均值(0,1)和单位方差的二维独立法线。对于每个职业(绿色和红色),生成100个随机点如下:

  1. 选择一个基点均匀、随机地选取合适的颜色。

  2. 生成具有均值的二维正态分布的独立随机点方差I/5, I是2 × 2单位矩阵。在本例中,使用方差I/50来更清楚地显示优化的优势。

为每个类生成10个基点。

rng (“默认”%的再现性grnpop = mvnrnd((1,0)、眼睛(2),10);redpop = mvnrnd([0, 1],眼(2),10);

查看基点。

情节(grnpop (: 1) grnpop (:, 2),“去”)举行情节(redpop (: 1) redpop (:, 2),“罗”)举行

图中包含一个axes对象。坐标轴对象包含两个line类型的对象。

由于一些红色基点接近绿色基点,因此很难仅根据位置对数据点进行分类。

生成每个类的100个数据点。

redpts = 0 (100 2);grnpts = redpts;i = 1:10 0 grnpts(我:)= mvnrnd (grnpop(兰迪(10):)、眼睛(2)* 0.02);redpts(我)= mvnrnd (redpop(兰迪(10):)、眼睛(2)* 0.02);结束

查看数据点。

图绘制(grnpts (: 1), grnpts (:, 2),“去”)举行情节(redpts (: 1) redpts (:, 2),“罗”)举行

图中包含一个axes对象。坐标轴对象包含两个line类型的对象。

为分类准备数据

把数据放到一个矩阵里,就得到一个向量grp它标记了每个点的类。1表示绿色类,-1表示红色类。

cdata = [grnpts; redpts];grp = 1 (200 1);grp (101:200) = 1;

准备交叉验证

为交叉验证设置一个分区。

c = cvpartition (200“KFold”10);

此步骤是可选的。如果您为优化指定一个分区,那么您就可以为返回的模型计算实际的交叉验证损失。

优化匹配

为了找到一个好的拟合,即一个具有最优超参数的拟合,使交叉验证损失最小化,可以使用贝叶斯优化。方法指定要优化的超参数列表OptimizeHyperparameters参数,并通过使用HyperparameterOptimizationOptions名称-值参数。

指定“OptimizeHyperparameters”作为“汽车”.的“汽车”选项包含一组要优化的典型超参数。fitcsvm的最优值BoxConstraint而且KernelScale.设置超参数优化选项以使用交叉验证分区c选择“expected-improvement-plus”再现性的采集功能。默认的采集函数取决于运行时,因此可以给出不同的结果。

选择=结构(“CVPartition”c“AcquisitionFunctionName”“expected-improvement-plus”);Mdl = fitcsvm (grp cdata,“KernelFunction”“rbf”...“OptimizeHyperparameters”“汽车”“HyperparameterOptimizationOptions”选择)
|=====================================================================================================| | Iter | Eval客观客观| | | BestSoFar | BestSoFar | BoxConstraint | KernelScale | | |结果| |运行时| | (estim(观察) .) | | | |=====================================================================================================| | 最好1 | | 0.345 | 0.26612 | 0.345 | 0.345 | 0.00474 | 306.44 | | 2 |最好| 0.115 | 0.16757 | 0.115 | 0.12678 | 430.31 | 1.4864 | | 3 |接受| 0.52 | 0.21336 | 0.115 | 0.1152 | 0.028415 | 0.014369 | | 4 |接受| 0.61 | 0.41833 | 0.115 | 0.11504 | 133.94 | 0.0031427 | | 5 |接受| 0.34 | 0.46056 | 0.115 | 0.11504 | 0.010993 | 5.7742 | | 6 |的| 0.085 | 0.25465 | 0.085 | 0.085039 | 885.63 | 0.68403 | | | 7日接受| 0.105 | 0.25751 | 0.085 | 0.085428 | 0.3057 | 0.58118 | | |接受8 | 0.21 | 0.28915 | 0.085 | 0.09566 | 0.16044 | 0.91824 | | | 9日接受| 0.085 | 0.30816 | 0.085 | 0.08725 | 972.19 | 0.46259 | | 10 |接受| 0.1 |0.34457 | 0.085 | 0.090952 | 990.29 | 0.491 | | 11 | Best | 0.08 | 0.21805 | 0.08 | 0.079362 | 2.5195 | 0.291 | | 12 | Accept | 0.09 | 0.24212 | 0.08 | 0.08402 | 14.338 | 0.44386 | | 13 | Accept | 0.1 | 0.23766 | 0.08 | 0.08508 | 0.0022577 | 0.23803 | | 14 | Accept | 0.11 | 0.24347 | 0.08 | 0.087378 | 0.2115 | 0.32109 | | 15 | Best | 0.07 | 0.30411 | 0.07 | 0.081507 | 910.2 | 0.25218 | | 16 | Best | 0.065 | 0.24431 | 0.065 | 0.072457 | 953.22 | 0.26253 | | 17 | Accept | 0.075 | 0.33287 | 0.065 | 0.072554 | 998.74 | 0.23087 | | 18 | Accept | 0.295 | 0.21231 | 0.065 | 0.072647 | 996.18 | 44.626 | | 19 | Accept | 0.07 | 0.26876 | 0.065 | 0.06946 | 985.37 | 0.27389 | | 20 | Accept | 0.165 | 0.24669 | 0.065 | 0.071622 | 0.065103 | 0.13679 | |=====================================================================================================| | Iter | Eval | Objective | Objective | BestSoFar | BestSoFar | BoxConstraint| KernelScale | | | result | | runtime | (observed) | (estim.) | | | |=====================================================================================================| | 21 | Accept | 0.345 | 0.20097 | 0.065 | 0.071764 | 971.7 | 999.01 | | 22 | Accept | 0.61 | 0.2416 | 0.065 | 0.071967 | 0.0010168 | 0.0010005 | | 23 | Accept | 0.345 | 0.26803 | 0.065 | 0.071959 | 0.0011459 | 995.89 | | 24 | Accept | 0.35 | 0.23608 | 0.065 | 0.071863 | 0.0010003 | 40.628 | | 25 | Accept | 0.24 | 0.39188 | 0.065 | 0.072124 | 996.55 | 10.423 | | 26 | Accept | 0.61 | 0.46697 | 0.065 | 0.072067 | 994.71 | 0.0010063 | | 27 | Accept | 0.47 | 0.28997 | 0.065 | 0.07218 | 993.69 | 0.029723 | | 28 | Accept | 0.3 | 0.24924 | 0.065 | 0.072291 | 993.15 | 170.01 | | 29 | Accept | 0.16 | 0.37085 | 0.065 | 0.072103 | 992.81 | 3.8594 | | 30 | Accept | 0.365 | 0.19017 | 0.065 | 0.072112 | 0.0010017 | 0.044287 |

图中包含一个axes对象。标题为Min objective vs. Number of function求值的axis对象包含两个类型为line的对象。这些对象表示最小观测目标,估计最小目标。

图中包含一个axes对象。标题为目标函数模型的轴对象包含线、面、轮廓5个类型的对象。这些对象分别表示观测点、模型均值、下一个点、模型最小可行。

__________________________________________________________ 优化完成。最大目标:达到30。总函数评估:30总运行时间:42.2011秒总目标函数评估时间:8.4361最佳观测可行点:BoxConstraint KernelScale _____________ ___________ 953.22 0.26253观测目标函数值= 0.065估计目标函数值= 0.073726函数评估时间= 0.24431最佳估计可行点(根据模型):BoxConstraint KernelScale _____________ ___________ 985.37 0.27389估计的目标函数值= 0.072112估计的函数评估时间= 0.28413
Mdl = ClassificationSVM ResponseName: 'Y' CategoricalPredictors: [] ClassNames: [-1 1] ScoreTransform: 'none' NumObservations: 200 HyperparameterOptimizationResults: [1x1 BayesianOptimization] Alpha: [77x1 double] Bias: -0.2352 KernelParameters: [1x1 struct] BoxConstraints: [200x1 double] ConvergenceInfo: [1x1 struct] IsSupportVector: [200x1 logical] Solver: 'SMO' Properties, Methods

fitcsvm返回一个ClassificationSVM模型对象使用最佳估计可行点。基于贝叶斯优化过程的高斯过程模型,估计的最佳可行点是最小化交叉验证损失置信上限的超参数集。

贝叶斯优化过程内部维持目标函数的高斯过程模型。目标函数为分类的交叉验证误分类率。对于每次迭代,优化过程更新高斯过程模型,并使用该模型找到一组新的超参数。迭代显示的每一行都显示了新的超参数集和这些列值:

  • 客观的-在新的超参数集上计算的目标函数值。

  • 目标运行时-目标功能评估时间。

  • Eval结果—结果报告,指定为接受最好的,或错误接受指示目标函数返回一个有限值,并且错误指示目标函数返回一个不是有限实标量的值。最好的指示目标函数返回一个有限值,该值低于先前计算的目标函数值。

  • BestSoFar(观察)-目前计算的最小目标函数值。该值是当前迭代的目标函数值(如果Eval结果当前迭代的值为最好的)或前一个的值最好的迭代。

  • BestSoFar (estim)。-在每次迭代中,软件使用更新的高斯过程模型,在迄今为止尝试的所有超参数集上估计目标函数值的上置信边界。然后,软件选择具有最小置信上限的点。的BestSoFar (estim)。方法返回的目标函数值predictObjective函数在最小值点处。

迭代显示下面的图显示了BestSoFar(观察)而且BestSoFar (estim)。值分别为蓝色和绿色。

返回的对象Mdl使用最佳估计可行点,即产生的超参数集BestSoFar (estim)。值在最终高斯过程模型的基础上进行最终迭代。

你可以从上面得到最好的点HyperparameterOptimizationResults属性或使用bestPoint函数。

Mdl.HyperparameterOptimizationResults.XAtMinEstimatedObjective
ans =1×2表BoxConstraint KernelScale  _____________ ___________ 985.37 - 0.27389
[x, CriterionValue迭代]= bestPoint (Mdl.HyperparameterOptimizationResults)
x =1×2表BoxConstraint KernelScale  _____________ ___________ 985.37 - 0.27389
CriterionValue = 0.0888
迭代= 19

默认情况下,bestPoint函数使用“min-visited-upper-confidence-interval”标准。该准则选择第19次迭代得到的超参数作为最佳点。CriterionValue为最终高斯过程模型计算的交叉验证损耗的上界。通过使用分区计算实际的交叉验证损失c

L_MinEstimated = kfoldLoss (fitcsvm (grp cdata,“CVPartition”c“KernelFunction”“rbf”...“BoxConstraint”x。BoxConstraint,“KernelScale”, x.KernelScale))
L_MinEstimated = 0.0700

交叉验证的实际损失与估算值接近。的估计目标函数值显示在优化结果的图下方。

您还可以提取观察到的最佳可行点(即最后一个点)最好的点在迭代显示)从HyperparameterOptimizationResults属性或通过指定标准作为“min-observed”

Mdl.HyperparameterOptimizationResults.XAtMinObjective
ans =1×2表BoxConstraint KernelScale  _____________ ___________ 953.22 - 0.26253
[x_observed, CriterionValue_observed iteration_observed] = bestPoint (Mdl。HyperparameterOptimizationResults,“标准”“min-observed”
x_observed =1×2表BoxConstraint KernelScale  _____________ ___________ 953.22 - 0.26253
CriterionValue_observed = 0.0650
iteration_observed = 16

“min-observed”Criterion选择第16次迭代得到的超参数作为最佳点。CriterionValue_observed是使用所选超参数计算的实际交叉验证损失。有关更多信息,请参见标准名称-值参数bestPoint

可视化优化的分类器。

d = 0.02;[x1Grid, x2Grid] = meshgrid (min (cdata (: 1)): d:马克斯(cdata (: 1)),...分钟(cdata (:, 2)): d:马克斯(cdata (:, 2)));xGrid = [x1Grid (:), x2Grid (:));[~,分数]=预测(Mdl xGrid);图h (1:2) = gscatter (cdata (: 1), cdata (:, 2), grp,“rg”' + *’);持有h(3) =情节(cdata (Mdl.IsSupportVector, 1),...cdata (Mdl.IsSupportVector, 2),“柯”);轮廓(x1Grid x2Grid,重塑(分数(:,2),大小(x1Grid)), [0 0),“k”);传奇(h, {' 1 '“+ 1”“支持向量”},“位置”“东南”);

图中包含一个axes对象。坐标轴对象包含4个对象,类型为直线、轮廓。这些对象表示-1,+1,支持向量。

评估新数据的准确性

生成并分类新的测试数据点。

grnobj = gmdistribution (grnpop。2 *眼(2));redobj = gmdistribution (redpop。2 *眼(2));newData =随机(grnobj 10);newData = [newData;随机(redobj 10)];grpData = 1(20日1);% green = 1grpData (11) = 1;% red = -1v =预测(Mdl newData);

计算测试数据集上的误分类率。

L_Test =损失(Mdl newData grpData)
L_Test = 0.3500

确定哪些新数据点被正确分类。将正确分类的点格式化为红色方块,将错误分类的点格式化为黑色方块。

h (4:5) = gscatter (newData (: 1), newData (:, 2), v,“mc”“* *”);mydiff = (v == grpData);%分类正确2 = mydiff在正确的点周围画红方格h(6) =情节(newData (ii, 1), newData (ii, 2),“rs”“MarkerSize”12);结束2 =不(mydiff)在不正确的点周围画黑色方块h(7) =情节(newData (ii, 1), newData (ii, 2),“ks”“MarkerSize”12);结束传奇(h, {“1”(培训)“+ 1(培训)”“支持向量”...“1”(分类)“+ 1(分类)”...正确分类的“是不是”},...“位置”“东南”);持有

图中包含一个axes对象。axis对象包含8个类型为line、contour的对象。这些对象表示-1(训练),+1(训练),支持向量,-1(已分类),+1(已分类),正确分类,错误分类。

绘制支持向量机分类模型的后验概率区域

这个例子展示了如何在观察网格上预测支持向量机模型的后验概率,然后绘制网格上的后验概率。绘制后验概率暴露了决策边界。

载入费雪的虹膜数据集。使用花瓣的长度和宽度训练分类器,并从数据中去除virginica物种。

负载fisheririsclassKeep = ~ strcmp(物种,“virginica”);X =量(classKeep 3:4);y =物种(classKeep);

使用这些数据训练SVM分类器。最好是指定类的顺序。

SVMModel = fitcsvm (X, y,“类名”, {“setosa”“多色的”});

估计最优分数变换函数。

rng (1);%的再现性[SVMModel, ScoreParameters] = fitPosterior (SVMModel);
警告:类是完全分离的。最佳得分-后验变换是一个阶梯函数。
ScoreParameters
ScoreParameters =结构体字段:类型:'step' LowerBound: -0.8431 UpperBound: 0.6897 PositiveClassProbability: 0.5000

由于类是可分离的,因此最优分数变换函数为阶梯函数。的字段下界而且UpperBoundScoreParameters标出与分类超平面内的观察值相对应的分数区间的下端点和上端点(边界)。任何训练观察都不在范围内。如果一个新的分数在区间内,那么软件给对应的观察分配一个正的类后验概率,即PositiveClassProbability领域的ScoreParameters

在观察到的预测器空间中定义一个值的网格。预测网格中每个实例的后验概率。

xMax = max (X);xMin = min (X);d = 0.01;[x1Grid, x2Grid] = meshgrid (xMin (1): d: xMax (1) xMin (2): d: xMax (2));[~, PosteriorRegion] =预测(SVMModel [x1Grid (:), x2Grid (:)));

绘制正类后验概率区域和训练数据。

图;contourf (x1Grid x2Grid,...重塑(PosteriorRegion(:, 2),大小(x1Grid, 1),大小(x1Grid, 2)));h = colorbar;h.Label.String =“P({\{杂色的}})';h.YLabel.FontSize = 16;caxis ([0 1]);colormap飞机;持有gscatter (X (: 1) X (:, 2), y,“mc”“方式”10],[15日);sv = X (SVMModel.IsSupportVector:);情节(sv (: 1), sv (:, 2),“哟”“MarkerSize”15岁的“线宽”2);轴持有

图中包含一个axes对象。坐标轴对象包含轮廓、直线类型的4个对象。这些物品代表了五彩缤纷的色彩。

在两类学习中,如果类是可分离的,那么有三个区域:一个是观察值具有正的类后验概率的区域0,一个在它所在的地方1,另一个是正类先验概率。

使用线性支持向量机分析图像

这个例子展示了如何通过训练由线性支持向量机二值学习器组成的错误校正输出码(ECOC)模型来确定一个形状占据图像的哪个象限。这个示例还说明了存储支持向量、它们的标签和估计值的ECOC模型的磁盘空间消耗 α 系数。

创建数据集

在50 × 50的图像中随机放置一个半径为5的圆。5000张图片。为每个图像创建一个标签,标明圆所占据的象限。象限1在右上,象限2在左上,象限3在左下,象限4在右下。预测器是每个像素的强度。

d = 50;%以像素为单位的图像的高度和宽度n = 5 e4;%样本大小X = 0 (n、d ^ 2);预测矩阵预分配Y = 0 (n, 1);%标签预先配置θ= 0:(1 / d):(2 *π);r = 5;%圆半径rng (1);%的再现性J = 1:n figmat = 0 (d);%空图像C = datasample((r + 1):(d - r - 1),2);%随机圆心X = r*cos() + c(1);%围成圆Y = r*sin() + c(2)Idx = sub2ind([d d],round(y),round(x));转换为线性索引figmat (idx) = 1;%画圆X (j) = figmat (:);%存储数据Y (j) = (c(2) > =地板(d / 2) + 2 * (c(2) <地板(d / 2)) +...(c(1) < floor(d/2)) +...2*((c(1) >=地板(d/2)) & (c(2) <地板(d/2)));%确定象限结束

情节一个观察。

图imagesc(figmat) h = gca;h.YDir =“正常”;标题(sprintf (“象限% d 'Y(结束)))

图中包含一个axes对象。标题为象限1的axes对象包含一个类型为image的对象。

训练ECOC模型

使用25%的抵制样本,并指定训练和抵制样本指数。

p = 0.25;本量利= cvpartition (Y,“坚持”, p);交叉验证数据分区isIdx =培训(CVP);%培训样本指数oosIdx =测试(CVP);测试样本指数%

创建一个支持向量机模板,指定存储二进制学习者的支持向量。将它和训练数据传递给fitcecoc训练模型。确定训练样本的分类误差。

t = templateSVM (“SaveSupportVectors”,真正的);MdlSV = fitcecoc (X (isIdx:), Y (isIdx),“学习者”t);isLoss = resubLoss (MdlSV)
isLoss = 0

MdlSV是一个培训ClassificationECOC多级模型。它存储每个二元学习者的训练数据和支持向量。对于大型数据集,例如图像分析中的数据集,模型可能会消耗大量内存。

确定ECOC模型消耗的磁盘空间量。

infoMdlSV =谁(“MdlSV”);mbMdlSV = infoMdlSV.bytes / 1.049 e6
mbMdlSV = 763.6150

该模型消耗763.6 MB。

提高模型效率

您可以评估样本外性能。您还可以使用不包含支持向量、支持向量的相关参数和训练数据的紧实模型来评估模型是否过拟合。

丢弃训练过的ECOC模型中的支持向量和相关参数。然后,使用丢弃结果模型中的训练数据紧凑的

Mdl = discardSupportVectors (MdlSV);CMdl =紧凑(Mdl);信息=谁(“Mdl”“CMdl”);[bytesCMdl, bytesMdl] = info.bytes;memReduction = 1 - [bytesMdl bytesCMdl]/ infomdslv .bytes . memReduction = 1 - [bytesMdl bytesCMdl
memReduction =1×20.0626 - 0.9996

在这种情况下,丢弃支持向量可以减少大约6%的内存消耗。压缩和丢弃支持向量会减少大约99.96%的大小。

管理支持向量的另一种方法是在训练期间通过指定更大的框约束(如100)来减少支持向量的数量。虽然使用较少支持向量的支持向量机模型更可取,并且消耗更少的内存,但增加框约束的值往往会增加训练时间。

删除MdlSV而且Mdl从工作空间。

清晰的MdlMdlSV

评估保留样品的性能

计算坚持样本的分类误差。绘制一个样本的坚持样本预测。

oosLoss =损失(CMdl X (oosIdx:), Y (oosIdx))
oosLoss = 0
yHat =预测(CMdl X (oosIdx:));nVec = 1:大小(X, 1);oosIdx = nVec (oosIdx);图;j = 1:9 subplot(3,3,j) imagesc(重塑(X(oosIdx(j),:),[d d])) h = gca;h.YDir =“正常”;标题(sprintf (“象限:% d 'yHat (j)))结束文本(-1.33 * d, 4.5 * d + 1,“预测”“字形大小”, 17)

图中包含9个轴对象。标题为象限:3的轴对象1包含一个类型为image的对象。标题象限:2的Axes对象2包含一个类型为image的对象。标题象限:2的轴对象3包含一个类型为image的对象。标题象限:2的Axes对象4包含一个类型为image的对象。标题象限:1的axis对象5包含一个类型为image的对象。标题象限:2的axis对象6包含一个类型为image的对象。标题象限:4的Axes对象7包含一个类型为image的对象。标题象限:4的Axes对象8包含一个类型为image的对象。标题象限:3的轴对象9包含两个类型为图像、文本的对象。

该模型没有对任何坚持的样本观察进行错误分类。

另请参阅

||

相关的话题

参考文献

[1]哈斯蒂,T., R.蒂布希拉尼,J.弗里德曼。统计学习的要素,第二版。纽约:施普林格,2008。

[2] Christianini, N.和J. Shawe-Taylor。支持向量机和其他基于核的学习方法简介.英国剑桥:剑桥大学出版社,2000年。

[3]球迷,R.-E。,林志信。陈,C.-J。林。用二阶信息选择工作集来训练支持向量机。机器学习研究杂志, 2005年第6卷,1889-1918页。

凯克曼V., t。黄和M.沃格特。从巨大数据集训练核机器的迭代单数据算法:理论和性能。在支持向量机:理论与应用.王立波主编,255-274。柏林:斯普林格出版社,2005年版。

Baidu
map