MATLAB中实现的基本SVM

  线性不可分的二元分类问题

首先,这个程序在使用RBF(gaussianKernel())时无法正常工作,我希望能修复这个问题。

这是一个非线性SVM演示,用于展示硬边界应用下的两类分类。

  • 问题涉及二维径向随机分布的数据。

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

xn    = input .* (output*[1 1]);    % xiyiphi   = gaussianKernel(xn, sigma2); % Radial Basis Functionk     = phi * phi';                 % Symmetric Kernel Matrix For QP Solvergamma = 1;                          % Adjusting the upper bound of alphasf     = -ones(2 * len, 1);          % Coefficient of sum of alphasAeq   = output';                    % yibeq   = 0;                          % Sum(ai*yi) = 0A     = zeros(1, 2* len);           % A * alpha <= b; There isn't like this termb     = 0;                          % There isn't like this termlb    = zeros(2 * len, 1);          % Lower bound of alphasub    = gamma * ones(2 * len, 1);   % Upper bound of alphasalphas = quadprog(k, f, A, b, Aeq, beq, lb, ub);
  • 为了解决这个非线性分类问题,我编写了一些核函数,如高斯(RBF)、同质和非同质多项式核函数。

对于RBF,我实现了下图所示的函数:

Gaussian Kernel

使用泰勒级数展开,得到如下结果:

RBG with Tylor Expansion

并且,我将高斯核函数分解如下:

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

这种思想的实现如下:

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 Dimensionphi     = []; % 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];    endend

*** 我认为我的RBF实现有问题,但我不知道如何修复它。请在这里帮助我。

这是我得到的输出:

Samples of Classes Marking The Support Vectors of Classes

Adding Random Test Data Classification

其中,

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

此外,我还实现了同质多项式核函数 ” K(x, x’) = ( )^2 “,代码如下:

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时,它无法正常工作,RBF的实现有问题。

如果你了解RBF(高斯核函数),请告诉我如何使其正确工作..

编辑:如果你有相同的问题,直接使用上面定义的RBF,不要通过phi分解它。


回答:

为什么你要为高斯核函数计算phi?phi将是一个无限维度的向量,而你在泰勒级数中将项限制为10,我们甚至不知道10是否足以近似核值!通常,核函数是直接计算的,而不是先得到phi(然后计算k)。例如[1]。

这是否意味着我们永远不应该为高斯计算phi?不完全是,但我们需要稍微聪明一些。最近的研究[2,3]展示了如何计算高斯核的phi,以便在仅有有限维度的phi的情况下计算近似核矩阵。这里[4]我给出了一个非常简单的代码来使用论文中的技巧生成近似核。然而,在我的实验中,我需要生成从100到10000维的phi才能获得核的良好近似(这取决于原始输入的特征数量以及原始矩阵的特征值衰减的速率)。

目前,请使用类似于[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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注