Vlfeat_svmtrain--- Train a Support Vector Machine:
调用格式:[W B] = VL_svmtrain(X, Y, lambda),用来 从数据向量X 和标签Y 训练一个线性支持向量机
X是 D乘N 的矩阵,每个示例有一列,一共有N列(N个训练样本),和 D个 单个元素或双元素 的特征维度(如4个LAB颜色特征通道)
Y是两个元素的向量(即-1或+1标签),同样是N个训练样本。
To a first order approximation,函数计算权重向量w和偏移b,使得计算得来的分数 w'.*x(:,i) + b,对于所有的 i 来说 具有相同的标签 (i),就是说训练出来的SVM分类器结果,与训练集x(:,i)里面带的标签 i 要一致的。
VL_SVMTRAIN(DATASET, LABELS, LAMBDA),(数据集、标签、λ),特别是输入数据集结构,其允许更复杂的输入格式被支持(参见VL_SVMDataSet());
[W, B, INFO] = VL_SVMTRAIN(...) 还能额外返回以下字段结构信息:
迭代:
执行的迭代次数;
Epoch:
数据样本集反复训练的的迭代次数。(Epoch:当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一个 epoch。然而,当一个 epoch 对于计算机而言太庞大的时候,就需要把它分成多个小块);
ElapsedTime:
训练开始后经过的时间;
目标:
支持向量机目标值;
正则化:
正则化值;
损失:
损失函数输出值。
[W,B,INFO,Score]=VL_SVMTRAIN(X,Y,LABMDA)
该形式为 每个训练样本 返回SVM得分的行向量。这可以与选项求解器、模型和偏差结合使用,以评估新数据点上现有的支持向量。此外,信息还将包含相应的SVM损失、正则化和目标函数值。如果这些信息不重要,则可以传递空向量Y而不是实际的标签以及空正则化参数,也就是在输出里 [ ,~] 表示即可。
FORMULATION--公式献上:
VL_SVMTRAIN() 最小化目标函数用如下形式:
LAMBDA/2 |W|^2 + 1/N SUM_i LOSS(W' X(:,i), Y(i)),where LOSS(W' Xi,Yi) is the loss (hinge by default) for i-th
data point,损失函数是hinge loss,即:
,
通过将每个数据点X的特征扩展为常数B0,从而使目标成为
LAMBDA/2 (|W|^2 + WB^2) 1/N SUM_i LOSS(W' X(:,i) + WB B0, Y(i)),就会产生偏差,注意,这会导致学习偏差B=WB B0向原点收缩。
以下为示例:
使用0.1作为正则化系数,从数据 X 和标签 Y 中学习线性支持向量机:
[w, b] = vl_svmtrain(x, y, 0.1) ;
支持向量机SVM可以通过以下方式对新数据XTEST进行评估:
scores = w'*xtest + b ; (这就是refine_pos_rf.m程序里的scores=svm_struct.w'*feat+svm_struct.b;)
或者,VL_SVMTRAIN()也可用于评估:
[~,~,~, scores] = vl_svmtrain(xtest, y, 0, 'model', w, 'bias', b, 'solver', 'none') ;
[~,得分]=vl_svmtrain(xtest,y,0,‘model’,w,‘偏差’,b,‘求解器’,‘none’);该形式在X是数据集结构时特别有用。