基于SVM的道路二值分割问题——在原空间中求解
最近做了一个关于使用支持向量机对道路图像进行二值分割的实验,要求在原空间中求解支持向量,有所收获,想记录下来。所以第一次写,有所不足,还请大家理解,相信后面会越来越好的。
支持向量机在原空间中的问题表示
相信大家都至少对支持向量机有基本的了解,在这里就不再赘述各种理论和推导步骤,直接给出在原空间中的目标函数和不等式约束,如下:
该问题是个凸二次规划问题,可以利用MATLAB中的quadprog()函数进行求解。
quadprog()函数介绍
在MATLAB中有专门解决二次规划问题的quadprog()函数,在原空间中求解支持向量机必定要用到它,因此在这里对其进行介绍。
首先,我们看MATLAB help文档中对quadprog()函数调用方式的介绍:
然后,再看此函数解决的二次规划问题描述形式,如下:
从以上可以发现,我们要解决二次规划问题,就要按照这个标准形式进行转换,从而能够构建出调用quadprog()函数所使用的输入参数H、f、A、b等等。所以下面将进行具体的描述形式转换,即构建相应的矩阵参数。
构建矩阵参数
在原空间中的目标函数需要求解两个量:w和b0。因此,对照二次规划的标准形式,可以进行以下的转换:
编程实现
下面是相应的程序:
function [w,b0] = svc_original(train_data,train_label)
%%函数功能:在原空间中利用MATLAB中的quadprog()函数求解凸二次规划问题
%输入:train_data:训练数据,在该问题中,是一个n*3的矩阵,列存储RGB值
% train_label:训练标签,已知的分类标签,+1或-1
%输出:w,b0:最优权向量
[n1,n2] = size(train_data);
%构建x = quadprog(H,f,A,b)中的H
%H是个前n2项对角线上为1,其余均为0的
H = zeros(n2+1,n2+1);
for i=1:n2
for j=1:n2
if (i==j)
H(i,j) = 1;
end
end
end
%构建f矩阵
f = zeros(n2+1,1);
%构建A矩阵
A = zeros(n1,n2+1);
for i=1:n1
A(i,:) = [-train_label(i)*train_data(i,:),-train_label(i)];
end
%构建b矩阵
b = -ones(n1,1);
%调用quadprog()函数
X = quadprog(H,f,A,b);
w = X(1:size(X,1)-1,:);
b0 = X(size(X,1),:);