本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

fitcsvm

训练用于一类和二类分类的支持向量机 (SVM) 分类器

说明

fitcsvm 基于低维或中维预测变量数据集训练或交叉验证一类和二类(二元)分类的支持向量机 (SVM) 模型。fitcsvm 支持使用核函数映射预测变量数据,并支持序列最小优化 (SMO)、迭代单点数据算法 (ISDA) 或 L1 软边距最小化(二次规划目标函数最小化)。

要基于高维数据集(即包含许多预测变量的数据集)训练二类分类线性 SVM 模型,请改用 fitclinear

对于结合使用二类 SVM 模型的多类学习,请使用纠错输出编码 (ECOC)。有关详细信息,请参阅 fitcecoc

要训练 SVM 回归模型,请参阅 fitrsvm(适用于低维和中维预测变量数据集)或 fitrlinear(适用于高维数据集)。

Mdl = fitcsvm(Tbl,ResponseVarName) 返回训练的支持向量机 (SVM) 分类器Mdl。该分类器使用表 Tbl 中包含的样本数据进行训练。ResponseVarNameTbl 中变量的名称,该变量包含一类或二类分类的类标签。

Mdl = fitcsvm(Tbl,formula) 返回训练的 SVM 分类器。该分类器使用表 Tbl 中包含的样本数据进行训练。formula 是用于拟合 Mdl 的解释模型,该模型由 Tbl 中的响应和一部分预测变量构成。

Mdl = fitcsvm(Tbl,Y) 返回训练的 SVM 分类器。该分类器使用表 Tbl 中的预测变量和向量 Y 中的类标签进行训练。

示例

Mdl = fitcsvm(X,Y) 返回训练的 SVM 分类器,该分类器使用矩阵 X 中的预测变量和向量 Y 中的一类或两类分类的类标签进行训练。

示例

除了上述语法中的输入参数之外,Mdl = fitcsvm(___,Name,Value) 还可使用一个或多个名称-值对组参数指定选项。例如,您可以指定交叉验证的类型、误分类的代价以及分数转换函数的类型。

示例

全部折叠

加载 Fisher 鸢尾花数据集。删除萼片的长度和宽度以及所有观测到的山鸢尾花。

load fisheriris
inds = ~strcmp(species,'setosa');
X = meas(inds,3:4);
y = species(inds);

使用经过处理的数据集训练 SVM 分类器。

SVMModel = fitcsvm(X,y)
SVMModel = 
  ClassificationSVM
             ResponseName: 'Y'
    CategoricalPredictors: []
               ClassNames: {'versicolor'  'virginica'}
           ScoreTransform: 'none'
          NumObservations: 100
                    Alpha: [24x1 double]
                     Bias: -14.4149
         KernelParameters: [1x1 struct]
           BoxConstraints: [100x1 double]
          ConvergenceInfo: [1x1 struct]
          IsSupportVector: [100x1 logical]
                   Solver: 'SMO'


  Properties, Methods

SVMModel 是经过训练的 ClassificationSVM 分类器。您可以查看 SVMModel 的属性。例如,使用圆点表示法查看类顺序。

classOrder = SVMModel.ClassNames
classOrder = 2x1 cell array
    {'versicolor'}
    {'virginica' }

第一个类 ('versicolor') 是负类,第二个类 ('virginica') 是正类。您可以使用 'ClassNames' 名称-值对组参数在训练期间更改类顺序。

绘制数据的散点图并圈出支持向量。

sv = SVMModel.SupportVectors;
figure
gscatter(X(:,1),X(:,2),y)
hold on
plot(sv(:,1),sv(:,2),'ko','MarkerSize',10)
legend('versicolor','virginica','Support Vector')
hold off

支持向量是发生在其估计的类边界之上或之外的观测值。

您可以使用 'BoxConstraint' 名称-值对组参数在训练过程中设置框约束来调整边界(从而调整支持向量的数量)。

加载 ionosphere 数据集。

load ionosphere
rng(1); % For reproducibility

使用径向基核训练 SVM 分类器。让软件计算核函数的缩放值。对预测变量进行标准化。

SVMModel = fitcsvm(X,Y,'Standardize',true,'KernelFunction','RBF',...
    'KernelScale','auto');

SVMModel 是经过训练的 ClassificationSVM 分类器。

交叉验证 SVM 分类器。默认情况下,软件使用 10 折交叉验证。

CVSVMModel = crossval(SVMModel);

CVSVMModelClassificationPartitionedModel 交叉验证的分类器。

估计样本外的误分类率。

classLoss = kfoldLoss(CVSVMModel)
classLoss = 0.0484

泛化率约为 5%。

通过将所有鸢尾花分配给同一个类来修改 Fisher 的鸢尾花数据集。检测修改后的数据集中的离群值,并确认观测值中离群值的预期比例。

加载 Fisher 鸢尾花数据集。删除花瓣的长度和宽度。将所有鸢尾花都视为来自同一个类。

load fisheriris
X = meas(:,1:2);
y = ones(size(X,1),1);

使用修改后的数据集训练 SVM 分类器。假设 5% 的观测值是离群值。对预测变量进行标准化。

rng(1);
SVMModel = fitcsvm(X,y,'KernelScale','auto','Standardize',true,...
    'OutlierFraction',0.05);

SVMModel 是经过训练的 ClassificationSVM 分类器。默认情况下,软件使用高斯核进行一类学习。

绘制观测值和决策边界。标记支持向量和潜在离群值。

svInd = SVMModel.IsSupportVector;
h = 0.02; % Mesh grid step size
[X1,X2] = meshgrid(min(X(:,1)):h:max(X(:,1)),...
    min(X(:,2)):h:max(X(:,2)));
[~,score] = predict(SVMModel,[X1(:),X2(:)]);
scoreGrid = reshape(score,size(X1,1),size(X2,2));

figure
plot(X(:,1),X(:,2),'k.')
hold on
plot(X(svInd,1),X(svInd,2),'ro','MarkerSize',10)
contour(X1,X2,scoreGrid)
colorbar;
title('{\bf Iris Outlier Detection via One-Class SVM}')
xlabel('Sepal Length (cm)')
ylabel('Sepal Width (cm)')
legend('Observation','Support Vector')
hold off

将离群值与其余数据分隔的边界出现在围道值为 0 的位置。

验证交叉验证数据中具有负分数的观测值的比例接近 5%。

CVSVMModel = crossval(SVMModel);
[~,scorePred] = kfoldPredict(CVSVMModel);
outlierRate = mean(scorePred<0)
outlierRate = 0.0467

创建 fisheriris 数据集的散点图。将图中网格的坐标点视为来自数据集分布的新观测值,并通过将坐标点分配给数据集中的三个类之一来找出类边界。

加载 Fisher 鸢尾花数据集。使用花瓣长度和宽度作为预测变量。

load fisheriris
X = meas(:,3:4);
Y = species;

检查数据的散点图。

figure
gscatter(X(:,1),X(:,2),Y);
h = gca;
lims = [h.XLim h.YLim]; % Extract the x and y axis limits
title('{\bf Scatter Diagram of Iris Measurements}');
xlabel('Petal Length (cm)');
ylabel('Petal Width (cm)');
legend('Location','Northwest');

该数据包含三个类,其中一个类与其他类可线性分离。

对于每个类:

  1. 创建一个逻辑向量 (indx),指示观测值是否为该类的成员。

  2. 使用预测变量数据和 indx 训练 SVM 分类器。

  3. 将该分类器存储在元胞数组的一个元胞中。

定义类顺序。

SVMModels = cell(3,1);
classes = unique(Y);
rng(1); % For reproducibility

for j = 1:numel(classes)
    indx = strcmp(Y,classes(j)); % Create binary classes for each classifier
    SVMModels{j} = fitcsvm(X,indx,'ClassNames',[false true],'Standardize',true,...
        'KernelFunction','rbf','BoxConstraint',1);
end

SVMModels 是 3×1 元胞数组,其中每个元胞包含一个 ClassificationSVM 分类器。对于每个元胞,正类分别是 setosa、versicolor 和 virginica。

在图中定义精细网格,并将坐标点视为来自训练数据分布的新观测值。使用每个分类器估计新观测值的分数。

d = 0.02;
[x1Grid,x2Grid] = meshgrid(min(X(:,1)):d:max(X(:,1)),...
    min(X(:,2)):d:max(X(:,2)));
xGrid = [x1Grid(:),x2Grid(:)];
N = size(xGrid,1);
Scores = zeros(N,numel(classes));

for j = 1:numel(classes)
    [~,score] = predict(SVMModels{j},xGrid);
    Scores(:,j) = score(:,2); % Second column contains positive-class scores
end

Scores 的每行包含三个分数。分数最高的元素的索引是新类观测值最可能属于的类的索引。

将每个新观测值与给它最高分数的分类器相关联。

[~,maxScore] = max(Scores,[],2);

基于对应新观测值所属的类,在绘图区域中着色。

figure
h(1:3) = gscatter(xGrid(:,1),xGrid(:,2),maxScore,...
    [0.1 0.5 0.5; 0.5 0.1 0.5; 0.5 0.5 0.1]);
hold on
h(4:6) = gscatter(X(:,1),X(:,2),Y);
title('{\bf Iris Classification Regions}');
xlabel('Petal Length (cm)');
ylabel('Petal Width (cm)');
legend(h,{'setosa region','versicolor region','virginica region',...
    'observed setosa','observed versicolor','observed virginica'},...
    'Location','Northwest');
axis tight
hold off

使用 fitcsvm 自动优化超参数。

加载 ionosphere 数据集。

load ionosphere

通过使用自动超参数优化,找到最小化五折交叉验证损失的超参数。为了实现可再现性,请设置随机种子并使用 'expected-improvement-plus' 采集函数。

rng default
Mdl = fitcsvm(X,Y,'OptimizeHyperparameters','auto',...
    'HyperparameterOptimizationOptions',struct('AcquisitionFunctionName',...
    'expected-improvement-plus'))

|=====================================================================================================|
| Iter | Eval   | Objective   | Objective   | BestSoFar   | BestSoFar   | BoxConstrain-|  KernelScale |
|      | result |             | runtime     | (observed)  | (estim.)    | t            |              |
|=====================================================================================================|
|    1 | Best   |     0.21652 |      18.493 |     0.21652 |     0.21652 |       64.836 |    0.0015729 |
|    2 | Accept |     0.35897 |     0.16509 |     0.21652 |     0.22539 |     0.036335 |       5.5755 |
|    3 | Best   |     0.13105 |       7.131 |     0.13105 |     0.14152 |    0.0022147 |    0.0023957 |
|    4 | Accept |     0.35897 |     0.10991 |     0.13105 |     0.13108 |       5.1259 |        98.62 |
|    5 | Accept |      0.1339 |      14.513 |     0.13105 |     0.13111 |    0.0011599 |    0.0010098 |
|    6 | Accept |     0.13105 |      3.3991 |     0.13105 |     0.13106 |    0.0010151 |    0.0045756 |
|    7 | Best   |     0.12821 |      9.0972 |     0.12821 |     0.12819 |    0.0010563 |    0.0022307 |
|    8 | Accept |      0.1339 |      11.601 |     0.12821 |     0.13013 |    0.0010113 |    0.0026572 |
|    9 | Accept |     0.12821 |      6.4781 |     0.12821 |     0.12976 |    0.0010934 |    0.0022461 |
|   10 | Accept |     0.12821 |      3.8203 |     0.12821 |     0.12933 |    0.0010315 |    0.0023551 |
|   11 | Accept |      0.1396 |       17.31 |     0.12821 |     0.12954 |       994.04 |      0.20756 |
|   12 | Accept |     0.13105 |      16.182 |     0.12821 |     0.12945 |       20.145 |     0.044584 |
|   13 | Accept |     0.21368 |      18.317 |     0.12821 |     0.12787 |       903.79 |     0.056122 |
|   14 | Accept |      0.1339 |     0.26202 |     0.12821 |     0.12939 |     0.018688 |     0.038639 |
|   15 | Accept |     0.12821 |      2.8504 |     0.12821 |      0.1295 |       5.6464 |      0.15938 |
|   16 | Accept |     0.13675 |      9.4282 |     0.12821 |     0.12798 |       0.5485 |     0.020716 |
|   17 | Accept |     0.12821 |      6.5178 |     0.12821 |     0.12955 |       1.2899 |     0.063233 |
|   18 | Accept |      0.1339 |      9.3664 |     0.12821 |     0.12957 |       869.51 |      0.94889 |
|   19 | Accept |     0.13675 |       9.368 |     0.12821 |     0.12957 |       112.89 |      0.31231 |
|   20 | Accept |     0.13105 |     0.12209 |     0.12821 |     0.12958 |    0.0010803 |      0.03695 |
|=====================================================================================================|
| Iter | Eval   | Objective   | Objective   | BestSoFar   | BestSoFar   | BoxConstrain-|  KernelScale |
|      | result |             | runtime     | (observed)  | (estim.)    | t            |              |
|=====================================================================================================|
|   21 | Accept |     0.13675 |      9.5117 |     0.12821 |      0.1299 |       7.7299 |     0.076169 |
|   22 | Best   |     0.12536 |     0.17058 |     0.12536 |     0.13007 |    0.0010485 |     0.013248 |
|   23 | Accept |     0.20228 |      18.202 |     0.12536 |     0.12548 |     0.060212 |    0.0010323 |
|   24 | Accept |      0.1339 |     0.24592 |     0.12536 |     0.12556 |      0.30698 |      0.16097 |
|   25 | Accept |      0.1339 |      15.142 |     0.12536 |     0.12923 |       963.05 |       0.5183 |
|   26 | Accept |     0.13675 |     0.27628 |     0.12536 |     0.12888 |    0.0039748 |     0.015475 |
|   27 | Accept |      0.1339 |      1.5718 |     0.12536 |     0.12889 |      0.33582 |     0.066787 |
|   28 | Accept |      0.1339 |      15.411 |     0.12536 |     0.12884 |       4.2069 |     0.032774 |
|   29 | Best   |     0.12536 |     0.13208 |     0.12536 |     0.12658 |    0.0010233 |     0.017839 |
|   30 | Accept |     0.12536 |     0.13041 |     0.12536 |     0.12579 |    0.0010316 |     0.019592 |

__________________________________________________________
Optimization completed.
MaxObjectiveEvaluations of 30 reached.
Total function evaluations: 30
Total elapsed time: 249.4758 seconds.
Total objective function evaluation time: 225.3244

Best observed feasible point:
    BoxConstraint    KernelScale
    _____________    ___________

      0.0010233       0.017839  

Observed objective function value = 0.12536
Estimated objective function value = 0.12579
Function evaluation time = 0.13208

Best estimated feasible point (according to models):
    BoxConstraint    KernelScale
    _____________    ___________

      0.0010233       0.017839  

Estimated objective function value = 0.12579
Estimated function evaluation time = 0.1535
Mdl = 
  ClassificationSVM
                         ResponseName: 'Y'
                CategoricalPredictors: []
                           ClassNames: {'b'  'g'}
                       ScoreTransform: 'none'
                      NumObservations: 351
    HyperparameterOptimizationResults: [1×1 BayesianOptimization]
                                Alpha: [91×1 double]
                                 Bias: -5.6976
                     KernelParameters: [1×1 struct]
                       BoxConstraints: [351×1 double]
                      ConvergenceInfo: [1×1 struct]
                      IsSupportVector: [351×1 logical]
                               Solver: 'SMO'


  Properties, Methods

输入参数

全部折叠

用于训练模型的样本数据,指定为表。Tbl 的每行对应一个观测值,每列对应一个预测变量。Tbl 也可以包含一个额外的对应于响应变量的列。不允许多列变量和字符向量元胞数组以外的元胞数组。

如果 Tbl 包含响应变量,并且您要使用 Tbl 中的所有其余变量作为预测变量,则使用 ResponseVarName 指定响应变量。

如果 Tbl 包含响应变量,并且您只想使用 Tbl 中其余一部分变量作为预测变量,则可使用 formula 指定公式。

如果 Tbl 不包含响应变量,则使用 Y 指定响应变量。响应变量的长度和 Tbl 中的行数必须相等。

数据类型: table

响应变量名称,指定为 Tbl 中变量的名称。

您必须以字符向量或字符串标量指定 ResponseVarName。例如,如果响应变量 Y 存储为 Tbl.Y,则将其指定为 'Y'。否则,软件在训练模型时会将 Tbl 的所有列(包括 Y)视为预测变量。

响应变量必须为分类、字符或字符串数组,逻辑或数值向量,或字符向量元胞数组。如果 Y 是字符数组,则响应变量的每个元素必须对应于数组的一行。

使用 ClassNames 名称-值对组参数来指定类的顺序是很好的做法。

数据类型: char | string

由响应变量和部分预测变量构成的解释模型,指定为 'Y~X1+X2+X3' 形式的字符向量或字符串标量。在此形式中,Y 表示响应变量,X1X2X3 表示预测变量。

要将 Tbl 中的一部分变量指定为模型训练的预测变量,请使用公式。如果您指定公式,则软件不会使用 Tbl 中未出现在 formula 中的任何变量。

公式中的变量名称必须既是 Tbl 中的变量名称 (Tbl.Properties.VariableNames),又是有效的 MATLAB® 标识符。

您可以使用 isvarname 函数来验证 Tbl 中的变量名称。以下代码为每个具有有效变量名称的变量返回逻辑值 1 (true)。

cellfun(@isvarname,Tbl.Properties.VariableNames)
如果 Tbl 中的变量名称无效,请使用 matlab.lang.makeValidName 函数进行转换。
Tbl.Properties.VariableNames = matlab.lang.makeValidName(Tbl.Properties.VariableNames);

数据类型: char | string

用于训练 SVM 模型的类标签,指定为分类、字符或字符串数组,逻辑或数值向量,或字符向量元胞数组。

  • Y 最多只能包含两个不同的类。有关多类学习的信息,请参阅 fitcecoc

  • 如果 Y 是字符数组,则类标签的每个元素必须对应于数组的一行。

  • Y 的长度和 TblX 的行数必须相等。

  • 使用 ClassNames 名称-值对组参数来指定类顺序是很好的做法。

数据类型: categorical | char | string | logical | single | double | cell

用于训练 SVM 分类器的预测变量数据,指定为数值矩阵。

X 的每行对应一个观测值(也称为实例或示例),每列对应一个预测变量(也称为特征)。

Y 的长度和 X 的行数必须相等。

要按预测变量在 X 中出现的顺序指定预测变量的名称,请使用 'PredictorNames' 名称-值对组参数。

数据类型: double | single

名称-值对组参数

指定可选的、以逗号分隔的 Name,Value 对组参数。Name 为参数名称,Value 为对应的值。Name 必须放在引号内。您可采用任意顺序指定多个名称-值对组参数,如 Name1,Value1,...,NameN,ValueN 所示。

示例: fitcsvm(X,Y,'KFold',10,'Cost',[0 2;1 0],'ScoreTransform','sign') 执行 10 折交叉验证,对假正的罚分是对假负的罚分的两倍,并使用 sign 函数转换分数。

SVM 选项

全部折叠

框约束,指定为逗号分隔的对组,其中包含 'BoxConstraint' 和一个正标量。

对于一类学习,软件始终将框约束设置为 1

有关 BoxConstraintCostPriorStandardizeWeights 的关系和算法行为的详细信息,请参阅算法

示例: 'BoxConstraint',100

数据类型: double | single

用于计算 Gram 矩阵的元素的核函数,指定为以逗号分隔的对组,其中包含 'KernelFunction' 和核函数名称。假设 G(xj,xk) 是 Gram 矩阵的元素 (j,k),其中 xj 和 xk 是 p 维向量,表示 X 中的观测值 j 和 k。下表说明支持的核函数名称及其函数形式。

核函数名称说明公式
'gaussian''rbf'高斯或径向基函数 (RBF) 核,默认用于一类学习

G(xj,xk)=exp(xjxk2)

'linear'线性核,默认用于二类学习

G(xj,xk)=xjxk

'polynomial'多项式核。使用 'PolynomialOrder',q 指定 q 次多项式核。

G(xj,xk)=(1+xjxk)q

您可以通过设置 'KernelFunction','kernel' 来设置自己的核函数,例如 kernel。值 kernel 必须采用以下形式。

function G = kernel(U,V)
其中:

  • U 是 m×p 矩阵。列对应于预测变量,行对应于观测值。

  • V 是 n×p 矩阵。列对应于预测变量,行对应于观测值。

  • GUV 行的 m×n Gram 矩阵

kernel.m 必须在 MATLAB 路径上。

避免对核函数使用泛型名称是很好的做法。例如,调用 sigmoid 核函数 'mysigmoid',而不是 'sigmoid'

示例: 'KernelFunction','gaussian'

数据类型: char | string

核尺度参数,指定为以逗号分隔的对组,其中包含 'KernelScale''auto' 或正标量。软件将预测变量矩阵 X 的所有元素除以 KernelScale 的值。然后,软件应用适当的核范数来计算 Gram 矩阵。

  • 如果您指定 'auto',则软件使用启发式过程选择适当的尺度因子。这种启发式过程使用二次抽样,因此不同调用的估计值可能不同。因此,为了重现结果,请在训练前使用 rng 设置随机数种子。

  • 如果您指定 KernelScale 和您自己的核函数,例如 'KernelFunction','kernel',则软件会引发错误。您必须在 kernel 中应用尺度缩放。

示例: 'KernelScale','auto'

数据类型: double | single | char | string

多项式核函数阶,指定为以逗号分隔的对组,其中包含 'PolynomialOrder' 和正整数。

如果您设置 'PolynomialOrder'KernelFunction 不是 'polynomial',则软件会引发错误。

示例: 'PolynomialOrder',2

数据类型: double | single

核偏移量参数,指定为以逗号分隔的对组,其中包含 'KernelOffset' 和一个非负标量。

软件将 KernelOffset 添加到 Gram 矩阵的每个元素。

默认值为:

  • 0,如果求解器是 SMO(也就是说,您设置 'Solver','SMO'

  • 0.1,如果求解器是 ISDA(也就是说,您设置 'Solver','ISDA'

示例: 'KernelOffset',0

数据类型: double | single

指示是否标准化预测变量数据的标志,指定为以逗号分隔的对组,其中包含 'Standardize'true (1) 或 false (0)

如果您设置 'Standardize',true

  • 软件按对应的加权列均值和标准差对每个预测变量(XTbl)进行中心化并缩放。有关加权标准化的详细信息,请参阅算法。MATLAB 不对为分类预测变量生成的虚拟变量列中包含的数据进行标准化。

  • 软件使用经过标准化的预测变量训练分类器,但会将未标准化的预测变量以矩阵或表形式存储在分类器属性 X 中。

示例: 'Standardize',true

数据类型: logical

优化例程,指定为以逗号分隔的对组,其中包含 'Solver' 和下表中的一个值。

说明
'ISDA'迭代单数据算法(请参阅 [30]
'L1QP'使用 quadprog 通过二次规划实现 L1 软边距最小化。此选项需要 Optimization Toolbox™ 许可证。有关详细信息,请参阅Quadratic Programming Definition (Optimization Toolbox)。
'SMO'序列最小优化(请参阅 [17]

对于二类学习或如果您将 'OutlierFraction' 设置为正值,默认值为 'ISDA';否则为 'SMO'

示例: 'Solver','ISDA'

alpha 系数的初始估计值,指定为以逗号分隔的对组,其中包含 'Alpha' 和非负值的数值向量。Alpha 的长度必须等于 X 的行数。

  • 'Alpha' 的每个元素对应于 X 中的一个观测值。

  • 'Alpha' 不能包含任何 NaN

  • 如果您指定 'Alpha' 和任一交叉验证名称-值对组参数('CrossVal''CVPartition''Holdout''KFold''Leaveout'),软件将返回错误。

如果 Y 包含任何缺失值,则删除与缺失值对应的 YX'Alpha' 的所有行。即,输入:

idx = ~isundefined(categorical(Y));
Y = Y(idx,:);
X = X(idx,:);
alpha = alpha(idx);
然后分别将 YXalpha 作为响应、预测变量和初始 alpha 估计值传递。

默认值为:

  • 0.5*ones(size(X,1),1)(用于一类学习)

  • zeros(size(X,1),1)(用于二类学习)

示例: 'Alpha',0.1*ones(size(X,1),1)

数据类型: double | single

缓存大小,指定为以逗号分隔的对组,其中包含 'CacheSize''maximal' 或正标量。

如果 CacheSize'maximal',则软件预留足够的内存来容纳整个 n×n Gram 矩阵

如果 CacheSize 是正标量,则软件会预留 CacheSize MB 内存用于训练模型。

示例: 'CacheSize','maximal'

数据类型: double | single | char | string

指定是否限定 alpha 系数的标志,指定为以逗号分隔的对组,其中包含 'ClipAlphas'truefalse

假设观测值 j 的 alpha 系数是 αj,观测值 j 的框约束是 Cj,j = 1、...、n,其中 n 是训练样本大小。

说明
true在每次迭代中,如果 αj 接近 0 或接近 Cj,则 MATLAB 分别将 αj 设置为 0 或 Cj
falseMATLAB 在优化过程中不更改 alpha 系数。

MATLAB 将 α 的最终值存储在经过训练的 SVM 模型对象的 Alpha 属性中。

ClipAlphas 会影响 SMO 和 ISDA 收敛。

示例: 'ClipAlphas',false

数据类型: logical

用于一类学习的 ν 参数,指定为由 'Nu' 和正标量组成的以逗号分隔的对组。Nu 必须大于 0 且最大为 1

Nu 用于在确保大多数训练样本为正类和尽量减小分数函数权重之间进行权衡。

示例: 'Nu',0.25

数据类型: double | single

优化诊断消息的输出间隔(迭代次数),指定为由 'NumPrint' 和非负整数组成的以逗号分隔的对组。

如果您指定 'Verbose',1'NumPrint',numprint,则软件会在命令行窗口中每隔 numprint 次迭代显示来自 SMO 和 ISDA 的所有优化诊断消息。

示例: 'NumPrint',500

数据类型: double | single

训练数据中离群值的预期比例,指定为以逗号分隔的对组,其中包含 'OutlierFraction' 和区间 [0,1) 中的数值标量。

假设您设置 'OutlierFraction',outlierfraction,其中 outlierfraction 是大于 0 的值。

  • 对于二类学习,软件实现稳健学习。换句话说,当优化算法收敛时,软件尝试删除 100*outlierfraction% 的观测值。删除的观测值对应于幅值较大的梯度。

  • 对于一类学习,软件会使用合适的偏差项,使得训练集中 outlierfraction 的观测值具有负分数。

示例: 'OutlierFraction',0.01

数据类型: double | single

指定是否在训练数据中用单一观测值替换重复观测值的标志,指定为以逗号分隔的对组,其中包含 'RemoveDuplicates'truefalse

如果 RemoveDuplicatestrue,则 fitcsvm 用相同值的单一观测值替换训练数据中的重复观测值。该单一观测值的权重等于对应删除副本的权重总和(请参阅 Weights)。

提示

如果您的数据集包含许多重复的观测值,则指定 'RemoveDuplicates',true 可以大大缩短收敛时间。

数据类型: logical

详细级别,指定为以逗号分隔的对组,其中包含 'Verbose'012Verbose 的值控制软件在命令行窗口中显示的优化信息量,并将这些信息作为结构体保存到 Mdl.ConvergenceInfo.History 中。

下表总结了可用的详细级别选项。

说明
0软件不显示或保存收敛信息。
1软件显示诊断消息,并每隔 numprint 次迭代保存收敛条件,其中 numprint 是名称-值对组参数 'NumPrint' 的值。
2软件显示诊断消息,并在每次迭代时保存收敛条件。

示例: 'Verbose',1

数据类型: double | single

其他分类选项

全部折叠

分类预测变量列表,指定为以逗号分隔的对组,其中包含 'CategoricalPredictors' 和下表中的值之一。

说明
正整数向量向量中的每个条目为一个索引值,对应于预测变量数据(XTbl)中包含分类变量的一列。
逻辑向量true 条目表示预测变量数据(XTbl)中的对应列是分类变量。
字符矩阵矩阵的每行均为预测变量的名称。名称必须与 PredictorNames 中的条目相匹配。系统用空格填充名称以使字符矩阵的每行具有相同的长度。
字符串数组或字符向量元胞数组数组中的每个元素均为预测变量的名称。名称必须与 PredictorNames 中的条目相匹配。
'all'所有预测变量均为分类预测变量。

默认情况下,如果预测变量数据在表 (Tbl) 中,并且它是逻辑向量、分类向量、字符数组、字符串数组或字符向量元胞数组,则 fitcsvm 假设变量是分类变量。如果预测变量数据是矩阵 (X),fitcsvm 假设所有预测变量均为连续的。要将任何其他预测变量识别为分类预测变量,请使用 'CategoricalPredictors' 名称-值对组参数指定它们。

对于已识别的分类预测变量,fitcsvm 根据分类变量是无序还是有序,使用两种不同方案创建虚拟变量。有关详细信息,请参阅Automatic Creation of Dummy Variables

示例: 'CategoricalPredictors','all'

数据类型: single | double | logical | char | string | cell

用于训练的类的名称,指定为以逗号分隔的对组,其中包含 'ClassNames' 和分类、字符或字符串数组,逻辑或数值向量,或字符向量元胞数组。ClassNames 必须与 Y 具有相同的数据类型。

如果 ClassNames 是字符数组,则每个元素必须对应于数组的一

使用 ClassNames 可以:

  • 在训练期间对类排序。

  • 指定对应于类顺序的任何输入或输出参数维度的顺序。例如,使用 ClassNames 指定 Cost 的维度的顺序或 predict 返回的分类分数的列顺序。

  • 选择用于训练的类的子集。例如,假设 Y 中所有不同类名的集合是 {'a','b','c'}。要仅使用来自 'a''c' 类的观测值训练模型,请指定 'ClassNames',{'a','c'}

ClassNames 的默认值为 Y 中所有不同类名的集合。

示例: 'ClassNames',{'b','g'}

数据类型: categorical | char | string | logical | single | double | cell

误分类代价,指定为以逗号分隔的对组,其中包括 'Cost' 和方阵或结构体数组。

  • 如果您指定方阵 Cost 且观测值的真实类是 i,则 Cost(i,j) 是将一个点分类到 j 类的代价。也就是说,行对应于真实类,列对应于预测的类。要为 Cost 的对应行和列指定类顺序,则还需指定 ClassNames 名称-值对组参数。

  • 如果您指定结构体 S,则它必须有两个字段:

    • S.ClassNames,其中包含类名作为一个变量,变量的数据类型与 Y 相同。

    • S.ClassificationCosts,其中包含按 S.ClassNames 中的顺序排列行和列的代价矩阵

对于二类学习,如果您指定代价矩阵,则软件将通过合并代价矩阵中所述的罚分来更新先验概率。因此,代价矩阵重置为默认值。有关 BoxConstraintCostPriorStandardizeWeights 的关系和算法行为的详细信息,请参阅算法

默认值为:

  • Cost = 0(用于一类学习)

  • Cost(i,j) = 1(如果 i ~= j)和 Cost(i,j) = 0(如果 i = j),用于二类学习

示例: 'Cost',[0,1;2,0]

数据类型: double | single | struct

预测变量名称,指定为以逗号分隔的对组,其中包含 'PredictorNames' 和唯一名称字符串数组或唯一字符向量元胞数组。'PredictorNames' 的功能取决于您提供训练数据的方式。

  • 如果您提供 XY,则您可以使用 'PredictorNames' 给出 X 中的预测变量名称。

    • PredictorNames 中名称的顺序必须对应于 X 中列的顺序。也就是说,PredictorNames{1}X(:,1) 的名称,PredictorNames{2}X(:,2) 的名称,依此类推。此外,size(X,2)numel(PredictorNames) 必须相等。

    • 默认情况下,PredictorNames{'x1','x2',...}

  • 如果您提供 Tbl,则您可以使用 'PredictorNames' 来选择在训练中使用哪些预测变量。也就是说,fitcsvm 仅使用 PredictorNames 中的预测变量和训练中的响应变量。

    • PredictorNames 必须为 Tbl.Properties.VariableNames 的子集,并且不能包含响应变量的名称。

    • 默认情况下,PredictorNames 包含所有预测变量的名称。

    • 最好仅使用 'PredictorNames'formula 来指定训练的预测变量。

示例: 'PredictorNames',{'SepalLength','SepalWidth','PetalLength','PetalWidth'}

数据类型: string | cell

每个类的先验概率,指定为以逗号分隔的对组,其中包含 'Prior' 和下表中的一个值。

说明
'empirical'类先验概率是 Y 中的类相对频数。
'uniform'所有类先验概率等于 1/K,其中 K 是类的数目。
数值向量向量中的每个元素均为类先验概率。根据 Mdl.ClassNames 对元素进行排序,或使用 ClassNames 名称-值对组参数指定顺序。软件对元素进行归一化,使其总和为 1
结构体

具有以下两个字段的结构体 S

  • S.ClassNames 包含类名作为一个变量,变量的数据类型与 Y 相同。

  • S.ClassProbs 包含对应先验概率的向量。软件会对向量的元素进行归一化,使其总和为 1

对于二类学习,如果您指定代价矩阵,则软件将通过合并代价矩阵中所述的罚分来更新先验概率。有关 BoxConstraintCostPriorStandardizeWeights 的关系和算法行为的详细信息,请参阅算法

示例: struct('ClassNames',{{'setosa','versicolor','virginica'}},'ClassProbs',1:3)

数据类型: char | string | double | single | struct

响应变量名称,指定为逗号分隔的对组,其中包含 'ResponseName' 和一个字符向量或字符串标量。

  • 如果您提供 Y,则您可以使用 'ResponseName' 来指定响应变量的名称。

  • 如果您提供 ResponseVarNameformula,则您无法使用 'ResponseName'

示例: 'ResponseName','response'

数据类型: char | string

分数转换,指定为以逗号分隔的对组,其中包含 'ScoreTransform' 和字符向量、字符串标量或函数句柄。

下表总结了可用的字符向量和字符串标量。

说明
'doublelogit'1/(1 + e–2x)
'invlogit'log(x / (1 – x))
'ismax'将分数最高的类的分数设置为 1,并将所有其他类的分数设置为 0
'logit'1/(1 + e–x)
'none''identity'x(无变换)
'sign'–1 表示 x < 0
0 表示 x = 0
1 表示 x > 0
'symmetric'2x – 1
'symmetricismax'将分数最高的类的分数设置为 1,并将所有其他类的分数设置为 –1
'symmetriclogit'2/(1 + e–x) – 1

对于 MATLAB 函数或您定义的函数,请使用其函数句柄进行分数转换。函数句柄必须接受矩阵(原始分数)并返回相同大小(转换后的分数)的矩阵。

示例: 'ScoreTransform','logit'

数据类型: char | string | function_handle

观测值权重,指定为以逗号分隔的对组,其中包含 'Weights' 和由正值组成的数值向量或 Tbl 中变量的名称。软件使用 Weights 中的对应值对 XTbl 的每行中的观测值进行加权。Weights 的大小必须等于 XTbl 的行数。

如果您将输入数据指定为表 Tbl,则 Weights 可以是包含数值向量的 Tbl 中的变量的名称。在本例中,您必须将 Weights 指定为字符向量或字符串标量。例如,如果权重向量 W 存储为 Tbl.W,则将其指定为 'W'。否则,软件在训练模型时会将 Tbl 的所有列(包括 W)视为预测变量或响应变量。

默认情况下,Weightsones(n,1),其中 nXTbl 中的观测值数目。

软件会对 Weights 进行归一化,使其总和等于对应类中的先验概率值。有关 BoxConstraintCostPriorStandardizeWeights 的关系和算法行为的详细信息,请参阅算法

数据类型: double | single | char | string

注意

不能将任何交叉验证名称-值对组参数与 'OptimizeHyperparameters' 名称-值对组参数结合使用。您只能通过使用 'HyperparameterOptimizationOptions' 名称-值对组参数来修改 'OptimizeHyperparameters' 的交叉验证。

交叉验证选项

全部折叠

指定是否训练交叉验证分类器的标志,指定为以逗号分隔的对组,其中包含 'Crossval''on''off'

如果您指定 'on',则软件使用 10 折来训练交叉验证分类器。

您可以使用 CVPartitionHoldoutKFoldLeaveout 名称-值对组参数覆盖此交叉验证设置。一次只能使用一个交叉验证名称-值对组参数来创建一个交叉验证模型。

或者,稍后通过将 Mdl 传递给 crossval 来进行交叉验证。

示例: 'Crossval','on'

交叉验证分区,指定为以逗号分隔的对组,其中包含 'CVPartition' 和使用 cvpartition 创建的 cvpartition 分区对象。该分区对象指定交叉验证的类型以及训练集和验证集的索引。

要创建交叉验证的模型,您只能使用以下四个名称-值对组参数之一:CVPartitionHoldoutKFoldLeaveout

示例: 假设您使用 cvp = cvpartition(500,'KFold',5) 创建一个随机分区,用于对 500 个观测值进行 5 折交叉验证。然后,您可以使用 'CVPartition',cvp 指定交叉验证的模型。

用于留出法验证的数据比例,指定为以逗号分隔的对组,其中包含 'Holdout' 和范围 (0,1) 内的标量值。如果您指定 'Holdout',p,则软件将完成以下步骤:

  1. 随机选择并预留 p*100% 的数据作为验证数据,并使用其余数据训练模型。

  2. 将经过训练的紧凑模型存储在交叉验证模型的 Trained 属性中。

要创建交叉验证的模型,您只能使用以下四个名称-值对组参数之一:CVPartitionHoldoutKFoldLeaveout

示例: 'Holdout',0.1

数据类型: double | single

交叉验证模型中使用的折的数目,指定为以逗号分隔的对组,其中包含 'KFold' 和大于 1 的正整数值。如果您指定 'KFold',k,则软件将完成以下步骤:

  1. 将数据随机分为 k 个数据集。

  2. 对于每个数据集,预留用作验证数据的数据集,并使用其他 k – 1 数据集训练模型。

  3. k 个紧凑的经过训练的模型存储在交叉验证模型的 Trained 属性中的 k×1 元胞向量的元胞中。

要创建交叉验证的模型,您只能使用以下四个名称-值对组参数之一:CVPartitionHoldoutKFoldLeaveout

示例: 'KFold',5

数据类型: single | double

留一法交叉验证标志,指定为以逗号分隔的对组,其中包含 'Leaveout''on''off'。如果您指定 'Leaveout','on',则对于 n 个观测值中的每一个(其中 n 是不包括缺失观测值的观测值数目,在模型的 NumObservations 属性中指定),软件完成以下步骤:

  1. 预留作为验证数据的观测值,并使用其他 n - 1 个观测值训练模型。

  2. 将 n 个紧凑的经过训练的模型存储在交叉验证模型的 Trained 属性中的 n×1 元胞向量的元胞中。

要创建交叉验证的模型,您只能使用以下四个名称-值对组参数之一:CVPartitionHoldoutKFoldLeaveout

示例: 'Leaveout','on'

收敛控制选项

全部折叠

通过序列最小优化 (SMO) 或迭代单数据算法 (ISDA) 获得的上违反量和下违反量之间梯度差的容差,指定为由 'DeltaGradientTolerance' 和非负标量组成的以逗号分隔的对组。

如果 DeltaGradientTolerance0,则软件不使用梯度差的容差来检查优化收敛。

默认值为:

  • 如果求解器是 SMO(例如,您设置 'Solver','SMO'),默认值为 1e-3

  • 如果求解器是 ISDA(例如,您设置 'Solver','ISDA'),默认值 0

示例: 'DeltaGradientTolerance',1e-2

数据类型: double | single

通过 SMO 或 ISDA 获得的可行性间隙容差,指定为由 'GapTolerance' 和非负标量组成的以逗号分隔的对组。

如果 GapTolerance0,则软件不使用可行性间隙容差来检查优化收敛。

示例: 'GapTolerance',1e-2

数据类型: double | single

数值优化迭代的最大次数,指定为以逗号分隔的对组,其中包含 'IterationLimit' 和一个正整数。

无论优化例程是否成功收敛,软件都会返回经过训练的模型。Mdl.ConvergenceInfo 包含收敛信息。

示例: 'IterationLimit',1e8

数据类型: double | single

Karush-Kuhn-Tucker (KKT) 互补条件违规容限,指定为由 'KKTTolerance' 和非负标量组成的以逗号分隔的对组。

如果 KKTTolerance0,则软件不使用 KKT 互补条件违规容限来检查优化收敛。

默认值为:

  • 如果求解器是 SMO(例如,您设置 'Solver','SMO'),默认值为 0

  • 如果求解器是 ISDA(例如,您设置 'Solver','ISDA'),默认值 1e-3

示例: 'KKTTolerance',1e-2

数据类型: double | single

活动集各次归约之间的迭代次数,指定为由 'ShrinkagePeriod' 和非负整数组成的以逗号分隔的对组。

如果您设置 'ShrinkagePeriod',0,则软件不会缩小活动集。

示例: 'ShrinkagePeriod',1000

数据类型: double | single

超参数优化选项

全部折叠

要优化的参数,指定为以逗号分隔的对组,其中包含 'OptimizeHyperparameters' 和下列值之一:

  • 'none' - 不优化。

  • 'auto' - 使用 {'BoxConstraint','KernelScale'}

  • 'all' - 优化所有合格参数。

  • 合格参数名称的字符串数组或元胞数组。

  • optimizableVariable 对象的向量,通常是 hyperparameters 的输出。

优化尝试通过更改参数来最小化 fitcsvm 的交叉验证损失(误差)。有关交叉验证损失的信息,请参阅Classification Loss。要控制交叉验证类型和优化的其他方面,请使用 HyperparameterOptimizationOptions 名称-值对组参数。

注意

'OptimizeHyperparameters' 值会覆盖您使用其他名称-值对组参数设置的任何值。例如,将 'OptimizeHyperparameters' 设置为 'auto' 会导致应用 'auto' 值。

fitcsvm 的合格参数包括:

  • BoxConstraint - fitcsvm 在正值中搜索,默认情况下对数尺度范围为 [1e-3,1e3]

  • KernelScale - fitcsvm 在正值中搜索,默认情况下对数尺度范围为 [1e-3,1e3]

  • KernelFunction - fitcsvm'gaussian''linear''polynomial' 中搜索。

  • PolynomialOrder - fitcsvm[2,4] 范围内的整数中搜索。

  • Standardize - fitcsvm'true''false' 中搜索。

通过传递具有非默认值的 optimizableVariable 对象的向量可设置非默认参数。例如:

load fisheriris
params = hyperparameters('fitcsvm',meas,species);
params(1).Range = [1e-4,1e6];

params 作为 OptimizeHyperparameters 的值传递。

默认情况下,迭代消息会出现在命令行中,绘图会根据优化中的超参数个数来显示。对于优化和绘图,目标函数在回归中是 log(1 + cross-validation loss),在分类中是误分类率。要控制迭代消息的显示,请设置 'HyperparameterOptimizationOptions' 名称-值对组参数的 Verbose 字段。要控制绘图,请设置 'HyperparameterOptimizationOptions' 名称-值对组参数的 ShowPlots 字段。

有关示例,请参阅优化 SVM 分类器

示例: 'auto'

优化的选项,指定为由 'HyperparameterOptimizationOptions' 和结构体组成的以逗号分隔的对组。此参数修改 OptimizeHyperparameters 名称-值对组参数的效果。结构体中的所有字段均为可选字段。

字段名称默认值
Optimizer
  • 'bayesopt' - 使用贝叶斯优化。在内部,此设置调用 bayesopt

  • 'gridsearch' - 使用网格搜索,每个维度有 NumGridDivisions 个值。

  • 'randomsearch' - 在 MaxObjectiveEvaluations 个点中随机搜索。

'gridsearch' 基于网格的均匀无放回抽样以随机顺序进行搜索。优化后,您可以使用命令 sortrows(Mdl.HyperparameterOptimizationResults) 按网格顺序获得一个表。

'bayesopt'
AcquisitionFunctionName

  • 'expected-improvement-per-second-plus'

  • 'expected-improvement'

  • 'expected-improvement-plus'

  • 'expected-improvement-per-second'

  • 'lower-confidence-bound'

  • 'probability-of-improvement'

其名称包含 per-second 的采集函数不会产生可重现的结果,因为优化取决于目标函数的运行时间。其名称包含 plus 的采集函数在过度开发某个区域时会更改其行为。有关详细信息,请参阅Acquisition Function Types

'expected-improvement-per-second-plus'
MaxObjectiveEvaluations目标函数计算的最大数量。对于 'bayesopt''randomsearch'30,对于 'gridsearch' 为整个网格
MaxTime

时间限制,指定为正实数。时间限制(以秒为单位),由 tictoc 测量。运行时间可以超过 MaxTime,因为 MaxTime 不会中断函数计算。

Inf
NumGridDivisions用于 'gridsearch',表示每个维度中的值的数量。该值可以是由指定每个维度上值个数的正整数组成的向量,也可以是应用于所有维度的标量。对于分类变量,此字段被忽略。10
ShowPlots指示是否显示绘图的逻辑值。如果为 true,此字段绘制最佳目标函数值对迭代编号的图。如果有一个或两个优化参数,并且如果 Optimizer'bayesopt',则 ShowPlots 也绘制目标函数对参数的模型图。true
SaveIntermediateResults指示当 Optimizer'bayesopt' 时是否保存结果的逻辑值。如果为 true,此字段将在每次迭代中覆盖名为 'BayesoptResults' 的工作区变量。变量是 BayesianOptimization 对象。false
Verbose

显示到命令行。

  • 0 - 不显示迭代消息

  • 1 - 显示迭代消息

  • 2 - 显示带额外信息的迭代消息

有关详细信息,请参阅 bayesopt Verbose 名称-值对组参数。

1
UseParallel指示是否并行运行贝叶斯优化的逻辑值,这需要 Parallel Computing Toolbox™。由于并行时序的不可再现性,并行贝叶斯优化不一定产生可重现的结果。有关详细信息,请参阅Parallel Bayesian Optimizationfalse
Repartition

逻辑值,指示是否在每次迭代时对交叉验证进行重新分区。如果为 false,优化器将使用单个分区进行优化。

设置为 true 通常可得到最稳健的结果,因为此设置考虑了分区噪声。然而,为了获得良好的结果,设置为 true 后函数计算次数至少会翻一倍。

false
请使用以下三个字段名称之一。
CVPartitioncvpartition 对象,由 cvpartition 创建。如果您没有指定任何交叉验证字段,默认为 'Kfold',5
Holdout(0,1) 范围内的标量,表示保留比例。
Kfold大于 1 的整数。

示例: 'HyperparameterOptimizationOptions',struct('MaxObjectiveEvaluations',60)

数据类型: struct

输出参数

全部折叠

经过训练的 SVM 分类模型,以 ClassificationSVM 模型对象或 ClassificationPartitionedModel 交叉验证模型对象形式返回。

如果您设置任一名称-值对组参数 KFoldHoldoutLeaveoutCrossValCVPartition,则 MdlClassificationPartitionedModel 交叉验证分类器。否则,MdlClassificationSVM 分类器。

要引用 Mdl 的属性,请使用圆点表示法。例如,在命令行窗口中输入 Mdl.Alpha 以显示经过训练的 Lagrange 乘数。

限制

  • fitcsvm 为一类或二类学习应用训练 SVM 分类器。要使用就有两个以上类的数据训练 SVM 分类器,请使用 fitcecoc

  • fitcsvm 支持低维和中维数据集。对于高维数据集,请改用 fitclinear

详细信息

全部折叠

框约束

框约束是参数,它控制对违反边距的观测值施加的最大罚分,这有助于防止过拟合(正则化)。

如果增加框约束,则 SVM 分类器分配的支持向量会更少。然而,增加框约束会导致更长的训练时间。

Gram 矩阵

由 n 个向量 {x1,..,xn; xj ∊ Rp} 组成的 Gram 矩阵是一个 n×n 矩阵,其中元素 (j,k) 定义为 G(xj,xk) = <ϕ(xj),ϕ(xk)>,即使用核函数 ϕ 的变换后的预测变量的内积。

对于非线性 SVM,算法使用预测变量数据 X 的行形成 Gram 矩阵。对偶问题形式用生成的 Gram 矩阵的对应元素替换 X 中观测值的内积(称为“核方法”)。因此,非线性 SVM 在变换后的预测变量空间中运算以找到分离超平面。

Karush-Kuhn-Tucker (KKT) 互补条件

KKT 互补条件是最优非线性规划解所需的优化约束。

在 SVM 中,对于所有 j = 1、...、n,KKT 互补条件是

{αj[yjf(xj)1+ξj]=0ξj(Cαj)=0

,其中 f(xj)=ϕ(xj)β+b, ϕ 是核函数(请参阅 Gram 矩阵),ξj 是松弛变量。如果这些类完全可分离,则对于所有 j = 1,...,n,满足 ξj = 0。

一类学习

一类学习,或无监督 SVM,旨在从高维预测变量空间(而不是原始预测变量空间)的原点分离数据,是一种用于离群值检测的算法。

该算法类似于二类分类的 SVM 的算法。目标是最小化关于 α1,...,αn 的对偶表达式

0.5jkαjαkG(xj,xk)

,且对于所有 j = 1、...、n,满足

αj=nν

0αj1。G(xj,xk) 的值在 Gram 矩阵的元素 (j,k) 中。

较小的 ν 值会导致较少支持向量,因此决策边界平滑、粗糙。较大的 ν 值会导致较多支持向量,因此决策边界弯曲、灵活。最佳 ν 值应足够大以体现数据的复杂性,同时足够小以避免过度训练。此外,0 < ν ≤ 1。

有关详细信息,请参阅 [5]

支持向量

支持向量是与 α1,...,αn 的严格正估计值对应的观测值。

对于给定训练集,最好选用产生较少支持向量的 SVM 分类器。

用于二类分类的支持向量机

SVM 二类分类算法搜索将数据分成两类的最优超平面。对于可分离类,最优超平面会最大化自身周围的边距(不包含任何观测值的空间),从而在正类和负类间创建边界。对于不可分离的类,目标是相同的,但是,如果有观测值位于其类边界的错误一侧,则算法会相应地对边距长度施加罚分。

线性 SVM 分数函数是

f(x)=xβ+b,

其中:

  • x 是观测值(对应于 X 的一行)。

  • 向量 β 包含定义超平面的正交向量的系数(对应于 Mdl.Beta)。对于可分离的数据,最佳边距长度是 2/β.

  • b 是偏差项(对应于 Mdl.Bias)。

特定系数的 f(x) 的根定义超平面。对于特定的超平面,f(z) 是从 z 点到超平面的距离。

算法搜索最大边距长度,同时将观测值分为正类 (y = 1) 和负类 (y = –1)。

  • 对于可分离的类,目标是最小化关于 β 和 b 的 β,并且对于所有 j = 1、...、n,满足 yjf(xj) ≥ 1。这是针对可分离类的问题形式。

  • 对于不可分离的类,算法会在遇到跨越类边界的观测值时使用松弛变量 (ξj) 对目标函数进行罚分。对于未跨越类边界的观测值,ξj = 0,否则 ξj ≥ 0。

    目标是最小化关于 β、b 和 ξj0.5β2+Cξj,对于所有 j = 1,..,n 和正标量框约束 C,满足 yjf(xj)1ξjξj0。这是针对不可分离类的原问题形式。

算法采用 Lagrange 乘数方法优化目标,引入 n 个系数 α1,...,αn(对应于 Mdl.Alpha)。线性 SVM 的对偶问题形式如下:

  • 对于可分离的类,最小化关于 α1,...,αn

    0.5j=1nk=1nαjαkyjykxjxkj=1nαj

    ,对于所有 j = 1,...,n,满足 αjyj=0,αj ≥ 0,且满足 Karush-Kuhn-Tucker (KKT) 互补条件

  • 对于不可分离的类,目标与可分离的类相同,不同之处是所有 j = 1、...、n 需满足附加条件 0αjC

得到的分数函数是

f^(x)=j=1nα^jyjxxj+b^.

b^ 是偏差的估计值,α^j 是向量 α^ 的第 j 个估计值,j = 1,...,n。写为这种形式时,score 函数不再需要原问题形式中的 β 估计值。

SVM 算法使用 sign(f^(z)). 对新观测值 z 进行分类

在某些情况下,非线性边界对类进行分隔。非线性 SVM 在经过变换的预测变量空间中计算以找到最佳的分离超平面。

非线性 SVM 的对偶问题可表示为关于 α1、...、αn 的以下形式

0.5j=1nk=1nαjαkyjykG(xj,xk)j=1nαj

对于所有 j = 1、..、n,满足 αjyj=00αjC,且满足 KKT 互补条件。G(xk,xj) 是 Gram 矩阵的元素。得到的分数函数是

f^(x)=j=1nα^jyjG(x,xj)+b^.

有关详细信息,请参阅了解支持向量机[1][3]

提示

  • 除非您的数据集很大,否则请始终尝试标准化预测变量(请参阅 Standardize)。标准化可使预测变量不受其测量尺度的影响。

  • 使用 KFold 名称-值对组参数进行交叉验证是很好的做法。交叉验证结果决定 SVM 分类器的泛化能力。

  • 对于一类学习:

    • 名称-值对组参数 Alpha 的默认设置可能导致较长的训练时间。要加快训练速度,可将 Alpha 设置为主要由 0 组成的向量。

    • 将名称-值对组参数 Nu 设置为更接近 0 的值可产生更少的支持向量,从而获得更平滑但粗糙的决策边界。

  • 支持向量中的稀疏性是 SVM 分类器的一个理想属性。要减少支持向量的数量,可将 BoxConstraint 设置为较大的值。此操作会增加训练时间。

  • 为了获得最佳训练时间,请将 CacheSize 设置为计算机允许的最大内存限制。

  • 如果您期望支持向量比训练集中的观测值少得多,则您可以使用名称-值对组参数 'ShrinkagePeriod' 缩小活动集,从而显著加快收敛速度。指定 'ShrinkagePeriod',1000 是很好的做法。

  • 远离决策边界的重复观测值不影响收敛。然而,决策边界附近出现的少数几个重复的观测值可能会大幅减慢收敛速度。在以下情况下,要加快收敛速度,请指定 'RemoveDuplicates',true

    • 您的数据集包含许多重复的观测值。

    • 您怀疑有几个重复的观测值接近决策边界。

    要在训练期间保留原始数据集,fitcsvm 必须临时分别存储两个数据集:原始数据集和没有重复观测值的数据集。因此,如果您为包含少量重复观测值的数据集指定 true,则 fitcsvm 消耗的内存将接近原始数据的两倍。

  • 在训练模型后,您可以生成预测新数据标签的 C/C++ 代码。生成 C/C++ 代码需要 MATLAB Coder™。有关详细信息,请参阅 Introduction to Code Generation

算法

  • 有关 SVM 二类分类算法的数学公式,请参阅用于二类分类的支持向量机了解支持向量机

  • NaN<undefined>、空字符向量 ('')、空字符串 ("") 和 <missing> 值表示缺失值。fitcsvm 会删除对应于缺失响应的整行数据。在计算总权重时(请参阅下几项内容),如果某权重所对应的观测值至少具有一个缺失变量,则 fitcsvm 忽略该权重。此操作会导致平衡类问题中出现不平衡的先验概率。因此,观测值框约束可能不等于 BoxConstraint

  • fitcsvm 会删除权重为零或先验概率为零的观测值。

  • 对于二类学习,如果您指定代价矩阵 C(请参阅 Cost),则软件会通过合并 C 中所述的罚分将类先验概率 p(请参阅 Prior)更新为 pc

    具体而言,fitcsvm 完成以下步骤:

    1. 计算 pc=pC.

    2. 归一化 pc*,使更新后的先验概率总和为 1。

      pc=1j=1Kpc,jpc.

      K 是类的数量。

    3. 将代价矩阵重置为默认值

      C=[0110].

    4. 从训练数据中删除对应于先验概率为零的类的观测值。

  • 对于二类学习,fitcsvm 将所有观测值权重归一化(请参阅 Weights),其总和为 1。然后,该函数将归一化的权重重新归一化,使其总和等于观测值所属类的更新后的先验概率。也就是说,k 类中观测值 j 的总权重是

    wj=wjjClass kwjpc,k.

    wj 是观测值 j 的归一化权重;pc、k 是 k 类的更新后的先验概率(请参阅上一项内容)。

  • 对于二类学习,fitcsvm 为训练数据中的每个观测值指定一个框约束。观测值 j 的框约束公式是

    Cj=nC0wj.

    n 是训练样本大小,C0 是初始框约束(请参阅 'BoxConstraint' 名称-值对组参数),而 wj 是观测值 j 的总权重(请参阅上一项内容)。

  • 如果您设置 'Standardize',true'Cost''Prior''Weights' 名称-值对组参数,则 fitcsvm 使用预测变量的对应加权均值和加权标准差来对预测变量进行标准化。也就是说,fitcsvm 使用

    xj=xjμjσj.

    μj=1kwkkwkxjk. 对预测变量 j (xj) 进行标准化

    xjk 是预测变量 j(列)的观测值 k(行)。

    (σj)2=v1v12v2kwk(xjkμj)2.

    v1=jwj.

    v2=j(wj)2.

  • 假设 p 是您预期在训练数据中的离群值比例,并且您设置了 'OutlierFraction',p

    • 对于一类学习,软件会训练偏差项,使得训练数据中 100p% 的观测值具有负分数。

    • 对于二类学习,软件会实施稳健学习。换句话说,当优化算法收敛时,软件会尝试删除 100p% 的观测值。删除的观测值对应于幅值较大的梯度。

  • 如果预测变量数据包含分类变量,则软件通常会对这些变量进行完全虚拟变量编码。软件为每个分类变量的每个水平创建一个虚拟变量。

    • PredictorNames 属性为每个原始预测变量名称存储一个元素。例如,假设有三个预测变量,其中一个是具有三个水平的分类变量。那么 PredictorNames 是 1×3 个字符向量元胞数组,其中包含预测变量的原始名称。

    • ExpandedPredictorNames 属性为每个预测变量(包括虚拟变量)存储一个元素。例如,假设有三个预测变量,其中一个是具有三个水平的分类变量。那么 ExpandedPredictorNames 就是 1×5 字符向量数组,其中包含预测变量和新虚拟变量的名称。

    • 同样,Beta 属性为每个预测变量(包括虚拟变量)存储一个 beta 系数。

    • SupportVectors 属性存储支持向量的预测变量值,包括虚拟变量。例如,假设有 m 个支持向量和三个预测变量,其中一个预测变量是具有三个水平的分类变量。那么 SupportVectors 就是 n×5 矩阵。

    • X 属性将训练数据存储为原始输入,不包括虚拟变量。当输入为表时,X 仅包含用作预测变量的列。

  • 对于表中指定的预测变量,如果任何变量包含经过排序的(有序)类别,软件会对这些变量使用有序编码。

    • 对于具有 k 个有序水平的变量,软件会创建 k – 1 个虚拟变量。在第 j 个虚拟变量中,前 j 个水平的对应值为 –1;从 j + 1 至 k 的水平的对应值为 +1

    • 存储在 ExpandedPredictorNames 属性中的虚拟变量的名称使用值 +1 指示第一个水平。软件会为虚拟变量另外存储 k – 1 个预测变量名称,包括水平 2、3、...、k 的名称。

  • 所有求解器都实现 L1 软边距最小化算法。

  • 对于一类学习,软件估计 Lagrange 乘数 α1、...、αn,满足

    j=1nαj=nν.

参考

[1] Christianini, N., and J. C. Shawe-Taylor. An Introduction to Support Vector Machines and Other Kernel-Based Learning Methods. Cambridge, UK: Cambridge University Press, 2000.

[2] Fan, R.-E., P.-H. Chen, and C.-J. Lin. “Working set selection using second order information for training support vector machines.” Journal of Machine Learning Research, Vol. 6, 2005, pp. 1889–1918.

[3] Hastie, T., R. Tibshirani, and J. Friedman. The Elements of Statistical Learning, Second Edition. NY: Springer, 2008.

[4] Kecman V., T. -M. Huang, and M. Vogt. “Iterative Single Data Algorithm for Training Kernel Machines from Huge Data Sets: Theory and Performance.” Support Vector Machines: Theory and Applications. Edited by Lipo Wang, 255–274. Berlin: Springer-Verlag, 2005.

[5] Scholkopf, B., J. C. Platt, J. C. Shawe-Taylor, A. J. Smola, and R. C. Williamson. “Estimating the Support of a High-Dimensional Distribution.” Neural Comput., Vol. 13, Number 7, 2001, pp. 1443–1471.

[6] Scholkopf, B., and A. Smola. Learning with Kernels: Support Vector Machines, Regularization, Optimization and Beyond, Adaptive Computation and Machine Learning. Cambridge, MA: The MIT Press, 2002.

扩展功能

在 R2014a 中推出