基本SVM在MATLAB中实现

时间:2014-11-11 17:34:51

标签: matlab machine-learning svm libsvm

  Linearly Non-Separable Binary Classification Problem

首先,这个节目不是'为RBF(gaussianKernel())正常工作,我想解决它。

这是一个非线性SVM演示,用于说明使用硬边距应用对2类进行分类。

  • 问题是关于二维径向随机分布数据。

  • 我使用二次规划求解器计算拉格朗日乘数(alphas)

xn    = input .* (output*[1 1]);    % xiyi
phi   = gaussianKernel(xn, sigma2); % Radial Basis Function

k     = phi * phi';                 % Symmetric Kernel Matrix For QP Solver
gamma = 1;                          % Adjusting the upper bound of alphas
f     = -ones(2 * len, 1);          % Coefficient of sum of alphas
Aeq   = output';                    % yi
beq   = 0;                          % Sum(ai*yi) = 0
A     = zeros(1, 2* len);           % A * alpha <= b; There isn't like this term
b     = 0;                          % There isn't like this term
lb    = zeros(2 * len, 1);          % Lower bound of alphas
ub    = gamma * ones(2 * len, 1);   % Upper bound of alphas

alphas = quadprog(k, f, A, b, Aeq, beq, lb, ub);
  • 为了解决这个非线性分类问题,我编写了一些核函数,如高斯(RBF),同质和非齐次多项式核函数。

对于RBF,我在下图中实现了该功能:

  

Gaussian Kernel

使用Tylor Series Expansion,它产生:

  

RBG with Tylor Expansion

而且,我像这样分离了高斯内核:

  

K(x,x&#39;)= phi(x)&#39; * phi(x&#39;)

这个想法的实现是:

function phi = gaussianKernel(x, Sigma2)

gamma   = 1 / (2 * Sigma2);
featDim = 10; % Length of Tylor Series; Gaussian Kernel Converge 0 so It doesn't have to Be Inf Dimension
phi     = []; % Kernel Output, The Dimension will be (#Sample) x (featDim*2)

    for k = 0 : (featDim - 1) 

        % Gaussian Kernel Trick Using Tylor Series Expansion
        phi = [phi, exp( -gamma .* (x(:, 1)).^2) * sqrt(gamma^2 * 2^k / factorial(k)) .* x(:, 1).^k, ...
            exp( -gamma .* (x(:, 2)).^2) * sqrt(gamma^2 * 2^k / factorial(k)) .* x(:, 2).^k];
    end

end

***我认为我的RBF实施是错误的,但我不是&#39;我知道如何解决它。请帮帮我。

这是我得到的输出:

  

Samples of Classes Marking The Support Vectors of Classes

     

Adding Random Test Data Classification

其中,

  

1)第一张图片:课程样本
  2)第二个图像:标记类的支持向量
  3)第三张图片:添加随机测试数据
  4)第四张图片:分类

另外,我实现了Homogenous Polinomial Kernel&#34; K(x,x&#39;)=()^ 2&#34 ;,代码为:

function phi = quadraticKernel(x)

    % 2-Order Homogenous Polynomial Kernel
    phi = [x(:, 1).^2, sqrt(2).*(x(:, 1).*x(:, 2)), x(:, 2).^2];

end

我得到了令人惊讶的好输出:

quadratic kernel output 1 quadratic kernel output 1

总之,程序使用同质多项式内核正常工作,但是当我使用RBF时,它不是&#39;如果工作正常,RBF实施有问题。

如果您了解RBF(高斯内核),请告诉我如何才能正确使用..

编辑:如果你遇到同样的问题,请直接使用上面定义的RBF,不要用phi来制作它。

2 个答案:

答案 0 :(得分:1)

由于高斯内核通常被称为映射到无穷大维度,因此我始终对其容量有信心。这里的问题可能是由于参数不好,同时要记住SVM培训总是需要网格搜索。因此,我建议您可以查看here,在那里您可以找到一些参数调整技巧。通常使用指数增加的序列作为候选者。

答案 1 :(得分:1)

为什么要为高斯内核计算phi? Phi将是无限维向量,当你甚至不知道10是否足以接近内核值时,你将泰勒系列中的术语限制为10!通常,直接计算内核而不是获得phi(和计算k)。例如[1]。

这是否意味着我们永远不应该计算高斯的phi?不是,不是,但我们必须对此稍微聪明一些。最近有一些工作[2,3]展示了如何计算高斯的phi,这样你就可以计算近似核矩阵,同时只有有限维的phi's。这里[4]我给出了非常简单的代码,使用本文的技巧生成近似内核。然而,在我的实验中,我需要生成100到10000维度的任何地方,以便能够获得内核的良好近似值(取决于原始输入所具有的特征数量以及原始矩阵的特征值逐渐减少。)

目前,只需使用类似于[1]的代码生成高斯内核,然后观察SVM的结果。另外,使用gamma参数,错误的gamma参数可能导致非常糟糕的分类。

[1] https://github.com/ssamot/causality/blob/master/matlab-code/Code/mfunc/indep/HSIC/rbf_dot.m

[2] http://www.eecs.berkeley.edu/~brecht/papers/07.rah.rec.nips.pdf

[3] http://www.eecs.berkeley.edu/~brecht/papers/08.rah.rec.nips.pdf

[4] https://github.com/aruniyer/misc/blob/master/rks.m