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. 完整代码
GitHub7. 参考
《视觉机器学习20讲》第九讲《Coursera 机器学习技法(林轩田 - 台湾大学 》03 Kernel Support Vector Machine
《机器学习实战》第六章
相关文章推荐
- LSI SVM 挑战IBM SVC
- 支持向量机(SVM)算法概述
- [转载]用opencv实现svm
- Learning to ranking简介
- 结构风险最小和VC维理论的解释
- SVM学习
- OpenCV之CvANN_MLP和CvSVM测试
- svm代码c++——机器学习
- svm支持向量机
- 关于监督学习(web数据挖掘)
- 基于SIFT特征和SVM的图像分类
- 阅读笔记之:Multimodal learning in Loosely-organized web images-CVPR2014
- svm详细总结
- libsvm的使用
- LibSVM 3.12的源码分析Svm-train.c
- libsvm 使用介绍
- OpenCV的SVM用法
- 开源SVM库libSVM介绍
- 支持向量机和逻辑回归的异同
- 关于惩罚因子和核函数的思考