首页 文章

基本SVM在MATLAB中实现

提问于
浏览
5
Linearly Non-Separable Binary Classification Problem

首先,这个程序对RBF(gaussianKernel())没有正常工作,我想修复它 .

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

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

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

xn = input . (输出 [1 1]); %xiyi
phi = gaussianKernel(xn,sigma2); %径向基函数

k = phi * phi'; QP求解器的%对称内核矩阵
gamma = 1; %调整alphas的上限
f = -ones(2 * len,1); %α总和的系数
Aeq =输出'; % 义
beq = 0; %Sum(ai * yi)= 0
A =零(1,2 * len); %A * alpha <= b;这个词没有这个词
b = 0; %没有这个词
lb =零(2 * len,1); %α的下限
ub = gamma * 1(2 * len,1); %alphas的上限

alphas = quadprog(k,f,A,b,Aeq,beq,lb,ub);

  • 为了解决这个非线性分类问题,我写了一些核函数,如高斯(RBF),同质和非齐次多项式核函数 .

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

使用Tylor Series Expansion,它可以产生:

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

K(x,x')= phi(x)'* phi(x')

这个想法的实现是:

function phi = gaussianKernel(x,Sigma2)

gamma = 1 /(2 * Sigma2);
featDim = 10; Tylor系列的长度%;高斯内核收敛0所以它不必是In Inf Dimension
phi = []; %内核输出,维度为(#Sample)x(featDim * 2)

对于k = 0:(featDim - 1)

使用Tylor系列扩展的%Gaussian Kernel Trick
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];
结束

结束

***我认为我的RBF实现是错误的,但我不知道如何解决它 . 请帮帮我 .

这是我得到的输出:

哪里,

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

另外,我实现了Homogenous Polinomial Kernel“K(x,x')=()^ 2”,代码是:

function phi = quadraticKernel(x)

%2阶齐次多项式核
phi = [x(:,1) . ^ 2,sqrt(2) . *(x(:,1) . * x(:,2)),x(:,2) . ^ 2];

结束

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

quadratic kernel output 1

quadratic kernel output 1

总之,程序正在使用同源多项式内核,但是当我使用RBF时,它不能正常工作,RBF实现有问题 .

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

编辑:如果您有相同的问题,请直接使用上面定义的RBF并且不要通过phi分类 .

2 回答

  • 1

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

    这是否意味着我们永远不应该计算高斯的phi?不是,不是,但我们必须对此稍微聪明一些 . 最近的工作[2,3]展示了如何计算高斯的phi,以便你可以计算近似的核矩阵,同时只有有限维的phi . 这里[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

  • 1

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

相关问题