您的位置:首页 > 其它

Kernel SVM (核函数支持向量机)

2015-07-13 17:49 316 查看

1. SVM 目标函数及约束条件

SVM 的介绍及数学推导参考:我的CSDN,此处直接跳过,直接给出 SVM 的目标函数和约束条件:

minw,b12wTws.t.yn(wTxn+b)≥1,n=1,..N

2. 对偶形式 SVM 目标函数

对偶形式 SVM 的推导参考:我的CSDN,此处直接跳过,直接给出对偶形式 SVM 的目标函数:

maxαn>0⎛⎝⎜⎜⎜⎜minw,b12wTw+∑Nn=1αn(1−yn(wTxn+b))L(w,b)⎞⎠⎟⎟⎟⎟

3. 对偶形式 SVM 求解

对偶形式 SVM 的详细求解过程参考:我的CSDN,此处只给出主要过程:

1. 标准对偶 SVM

minαn>0(12∑Nn=1∑Nm=1αnαmynymxTnxm||−∑Nn=1αn)s.t.∑Nn=1αnyn=0αn=0,n=1,2,...,n

2. 转化为二次规划问题

α←QP(Q,p,A,c)minu12αTQα+pTαs.t.aTmα≥cm,m=1,2,...,M

qn,m=ynymxTnxmp=−1Nc=0

3. 求解 b,w

w=∑Nn=1αnynxn

αn(1−yn(wTxn+b))=0αn>0→b=yn−wTx

matlab 中的 quadprog 函数可用于求解该问题。

4. Kernel SVM

在 1,2,3部份探讨的都是线性可分的 SVM,但是遇到线性不可分的情况时,上述方法将失效,例如下图所示的数据,直观的观测很容易发现,圆形的分类器将很容易解决上述问题。



此时我们将使用一种叫做核函数(kernel)的工具,将数据从一个空间转换到另一个空间,使其变成易于分类器理解的形式。但要确保核函数可以很快速的进行计算,否则影响效率。

常用的核函数有:

1. 多项式核函数(Polynomial Kernel),其形式如下:

Kernel(X,X′)=(ξ+γXTX′)Q

2. 径向基函数(Radial Basis Function,RBF),其形式如下:

Kernel(X,X′)=e(−||X−X′||22σ2)

上述高斯核函数将数据从特征空间映射到更高维的空间,具体来说这里是映射到一个无穷维的空间。

将核函数(kernel)引入到 SVM 中也就是替换 SVM 中的 XTY 为 Kernel(X,Y),也就是将第3部份第2步的二次规划规划问题中的 XTX 为 Kernel(X,X),例如二次项核函数的 (1+XT∗X)2,将

b=ys−wTxs=ys−(∑Nn=1αnynxn)xs

替换为:

b=ys−∑Nn=1αnynKernel(xn,xs)

其中 s 表示某个支持向量。

最后,将:

gsvm(x)=sign(wTx+b)=sign((∑Nn=1αnynxn)x+b)

替换为:

gsvm(x)=sign(∑Nn=1αnynKernel(xn,x)+b)

5. 示例

% 功能:演示 Kernel SVM算法
% 时间:2015-07-13

clc
clear all
close all

%% 测试样本
dataLength = 2;
dataNumber = [50, 50];

xrand = 8 * (rand(dataLength, dataNumber(1)+dataNumber(2)) - 0.5);
% 第一类
x1 = xrand(:, sum(xrand .* xrand, 1) > 5) + 3;
dataNumber(1) = size(x1, 2);
y1 = ones(1, dataNumber(1));

% 第二类
x2 = xrand(:, sum(xrand .* xrand, 1) <= 3) + 3;
dataNumber(2) = size(x2, 2);
y2 = -ones(1, dataNumber(2));

% 显示
figure(1);
plot(x1(1,:), x1(2,:), 'bx', x2(1,:), x2(2,:), 'k.');
axis([-3 8 -3 8]);
title('Kernel SVM')
hold on

% 合并样本
X = [x1, x2];
Y = [y1, y2];

% 打乱样本顺序
index = randperm(sum(dataNumber));
X(:, index) = X;
Y(:, index) = Y;

%% Kernel SVM 训练
[alpha, b] = kernelSvmTrainMine(X, Y);

%% 提取 SV
epsilon = 1e-5;
indexSV = find(alpha > epsilon);

%% 标记 SV
plot(X(1,indexSV), X(2,indexSV), 'ro');
hold on

%% 测试输出
[x1, x2] = meshgrid(-2:0.1:7, -2:0.1:7);
[rows, cols] = size(x1);
nt = rows * cols;
Xt = [reshape(x1,1,nt); reshape(x2,1,nt)];

Yd = sign(sum(bsxfun(@times, alpha(indexSV) .* Y(indexSV)', kernel(X(:, indexSV), Xt))) + b);

Yd = reshape(Yd, rows, cols);
contour(x1,x2,Yd,[0 0],'m');
hold off;


多项式型核函数结果:



径向基核函数结果:



6. 完整代码

GitHub

7. 参考

《视觉机器学习20讲》第九讲

《Coursera 机器学习技法(林轩田 - 台湾大学 》03 Kernel Support Vector Machine

《机器学习实战》第六章
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息