这个练习让你练习如何使用SVMs进行线性和非线性分类。
第一部分是实现一个正则化的SVM分类器。它的细节可以在课堂幻灯片中找到。我们在此仅给出SVM的一个草图。正则化支持向量机可以表示为
min ω , b , ξ 1 2 ∥ ω ∥ 2 + C ∑ i = 1 m ξ i s.t. y ( i ) ( ω T x ( i ) + b ) ≥ 1 − ξ i , ∀ i = 1 , ⋯   , m ξ i ≥ 0 , ∀ i = 1 , ⋯   , m \begin{array} { l l } { \min _ { \omega , b , \xi } } & { \frac { 1 } { 2 } \| \omega \| ^ { 2 } + C \sum _ { i = 1 } ^ { m } \xi _ { i } } \\ { \text {s.t.} } & { y ^ { ( i ) } \left( \omega ^ { T } x ^ { ( i ) } + b \right) \geq 1 - \xi _ { i } , \quad \forall i = 1 , \cdots , m } \\ { } & { \xi _ { i } \geq 0 , \quad \forall i = 1 , \cdots , m } \end{array} minω,b,ξs.t.21∥ω∥2+C∑i=1mξiy(i)(ωTx(i)+b)≥1−ξi,∀i=1,⋯,mξi≥0,∀i=1,⋯,m
其中 ξ i \xi_i ξi是松弛印象。它的对偶问题可以定义为
min α ∑ i = 1 m α i − 1 2 ∑ i , j = 1 m y ( i ) y ( j ) α i α j < x ( i ) , x ( j ) > s.t. 0 ≤ α i ≤ C , ∀ i = 1 , ⋯   , m ∑ i = 1 m α i y ( i ) = 0 \begin{array} { c l } { \min _ { \alpha } } & { \sum _ { i = 1 } ^ { m } \alpha _ { i } - \frac { 1 } { 2 } \sum _ { i , j = 1 } ^ { m } y ^ { ( i ) } y ^ { ( j ) } \alpha _ { i } \alpha _ { j } < x ^ { ( i ) } , x ^ { ( j ) } > } \\ { \text {s.t.} } & { 0 \leq \alpha _ { i } \leq C , \quad \forall i = 1 , \cdots , m } \\ { } & { \sum _ { i = 1 } ^ { m } \alpha _ { i } y ^ { ( i ) } = 0 } \end{array} minαs.t.∑i=1mαi−21∑i,j=1my(i)y(j)αiαj<x(i),x(j)>0≤αi≤C,∀i=1,⋯,m∑i=1mαiy(i)=0
通过求解上述QP问题,我们可以得到一个SVM分类器。为了简单起见,我们可以利用现有的QP求解器(例如Matlab中的quadprog或Octave中的QP)。
给出了两个数据集,每个数据集又分为训练和测试两部分。特别是,第一个数据集包含training_1.txt用于训练和test_1.txt用于测试。第二个包含training_2.txt和test_2.txt。在这些数据文件中,前两列是特征,最后一列是label。分别在两个数据集上尝试SVM,并回答下列问题
第二部分是应用SVM分类器识别手写数字。训练和测试的数据集在train-01-image.svm和test-01-images.svm给出。为了简化,我们只区分0和1。训练数据集包含12665张图片,测试数据集包含2115张图片。每一行表示一个图像,其中第一项是标签,而下面是像素的索引和相应的灰度值。注意,只给出非零灰度值的像素。请仔细阅读并尝试strimage.m,其中给出了如何处理数据的实例。在你的报告中展示一些数据例子。根据训练数据对SVM模型进行训练,并将其应用于识别测试数据集中给出的手写字体。请回答以下问题
支持非线性支持向量机的一种方法是引入内核。回想一下,线性不可分的特征在映射到高维特征空间后通常会变成线性可分。然而,我们不需要计算特征映射 ϕ ( x ( i ) ) \phi(x^{(i)}) ϕ(x(i)),明确:我们只需要使用他们的内核,这更容易计算。因此,基于高维(甚至无限维)特征映射创建非常复杂的决策边界是可能的,但由于核表示的原因,仍然具有高效的计算能力。
在这个练习中,你将使用LIBSVM中的径向基函数(RBF)内核。这个核有公式
K ( x ( i ) , x ( j ) ) = ϕ ( x ( i ) ) T ϕ ( x ( j ) ) = exp ( − γ ∥ x ( i ) − x ( j ) ∥ 2 ) , γ > 0 K \left( x ^ { ( i ) } , x ^ { ( j ) } \right) = \phi \left( x ^ { ( i ) } \right) ^ { T } \phi \left( x ^ { ( j ) } \right) = \exp \left( - \gamma \left\| x ^ { ( i ) } - x ^ { ( j ) } \right\| ^ { 2 } \right) , \quad \gamma > 0 K(x(i),x(j))=ϕ(x(i))Tϕ(x(j))=exp(−γ∥∥∥x(i)−x(j)∥∥∥2),γ>0
请注意,这是和高斯一样的内核,除了这一项 1 2 σ 2 \frac { 1 } { 2 \sigma ^ { 2 } } 2σ21在高斯内核中已被 γ \gamma γ取代。再一次,记住任何时候你需要直接计算 ϕ ( x ) \phi(x) ϕ(x)。事实上, ϕ ( x ) \phi(x) ϕ(x)对于这个内核是无限维的,所以将其存储在内存中是不可能的。
现在我们来看RBF核是如何选择非线性决策边界的。加载数据集training 3.txt并导入Matlab/Octave工作区中。这是一个二分类问题。用不同的颜色标出正负号。此数据集是否存在线性决策边界?
根据上面的练习用一个RBF内核与 γ = 100 \gamma=100 γ=100训练支持向量机模型。一旦你有了模型,你需要可视化决策边界,参考代码如下
%Make classification predictions over a grid of values
xplot = linespace(min(features(:,1)),max(features(:,1)),100)';
yplot = linespace(min(features(:,2)),max(features(:,2)),100)';
[X,Y] = zeros(size(X));
......
%Plot the SVM boundary
colormap bone
contour(X,Y,vals,[0 0],'LineWidth',4);
回想一下,这是函数 ∑ i α i y ( i ) K ( x ( i ) , x ) + b \sum _ { i } \alpha _ { i }y^{(i)} K \left( x ^ { ( i ) } , x \right) + b ∑iαiy(i)K(x(i),x)+b的决策值用来分类。一个例子 x x x被分类为一个正的标签,如果 ∑ i α i y ( i ) K ( x ( i ) , x ) + b ≥ 0 \sum _ { i } \alpha _ { i }y^{(i)} K \left( x ^ { ( i ) } , x \right) + b \geq 0 ∑iαiy(i)K(x(i),x)+b≥0,否则,被分类为一个负的标签。
现在使用 γ = 1 , 10 , 100 \gamma=1,10,100 γ=1,10,100和 1000 1000 1000训练你的模型并画出每个模型的决策边界(使用countour填充)。不同的 γ \gamma γ决策边界如何变化?
这是一项可选的附加工作。如果你使用最小优先序列(SMO)算法来替换标准QP求解程序,那么你可以获得额外的学分。