支持向量机曾是机器学习领域中的主流方法。针对小样本,现在用起来依然很方便。同时,该方面的工具和教程多得数不清。所以这里引用老师木的话就很合适:“经常,有些事还没做就已经知道它无意义,于是就没做;有些事做不做都知道无意义,还是蠢蠢欲动”。

本篇围绕“用现有的库把自己的代码工作量减到最小”为话题,以比大多教程尽量简单的支持向量机理论和实践为例,讲述软件与硬件(DSP或FPGA等)结合时的偷懒方法

1. 基本原理 5

(1) 超平面

假设数据集中有ll个样本,每个样本包括属性向量和标签。所以,有样本{(X1,y1)...(Xi,yi),...(Xl,yl)}\lbrace (X^1,y^1)...(X^i,y^i),...(X^l,y^l) \rbrace,ll为样本的个数,yi∈{−1,1}y^i\in \lbrace -1,1\rbrace为标签,第ii个样本Xi=[xi1,...,xin]X^{i}=[x^i_1,...,x^i_n],nn为每个样本的属性数目。

超平面的方程为:

H=wTX+b=w0x0+w1x1+...+wnxn+b=0

H=w^TX+b=w_0x_0+w_1x_1+...+w_nx_n+b=0
其中,ww为nn维权重,b为偏置。

如果数据可分,则存在很多可分的超平面。贴着正负样本时的边缘超平面为H=±1H=\pm1,中间超平面为H=0H=0。最优的超平面会使边缘超平面和中间超平面之间的间隔最大。

(2) 优化

第i个样本的属性向量XiX^i距离超平面HH的距离为:

d(Xi,H)=wTXi||w||

d(X^i,H)=\frac{w^TX^i}{||w||}

最大化间隔等价于优化问题:

minw,b12||w||2s.t.yi(wTXi+b)≥1,i=1,...,l

\begin{align} &\min_{w,b} \frac{1}{2}||w||^2 \\&s.t.y_i(w^TX^i+b)\ge1, i=1,...,l \end{align}

  • 超平面H=±1H=\pm1之间的距离为2||w||\frac{2}{||w||},所以最大化间隔等价于最小化||w||22\frac{||w||^2}{2}。
  • 当yi=1y_i=1时,wTXi+b≥1w^TX^i+b\ge1,xix^i位于H=1H=1超平面的上侧;
  • 当yi=−1y_i=-1时,wTXi+b≤1w^TX^i+b\le1,xix^i位于H=−1H=-1超平面的下侧。

(3) 二次规划函数

X = quadprog(H,f,A,c)

二次规划函数求解关于向量X的二次规划问题:

minX12XTHX+fXs.t.AX≤c

\begin{align} &\min_{X}\frac{1}{2}X^THX+fX \\&s.t.AX\le c \end{align}

X仅表示二次规划要求解的项,与SVM中的样本数据没有关系。

(4) 编码优化问题

a. 目标函数

12wTw=12(wb)(I000)(wb)=12(w1w2...wnb)⎛⎝⎜⎜⎜⎜⎜⎜100000100000...000001000000⎞⎠⎟⎟⎟⎟⎟⎟⎛⎝⎜⎜⎜⎜⎜⎜w1w2...wnb⎞⎠⎟⎟⎟⎟⎟⎟

\begin{align} &\frac{1}{2}w^Tw \\&=\frac{1}{2}\left(\begin{matrix}w&b\end{matrix}\right) \left(\begin{matrix}I&0\\0&0\end{matrix}\right) \left(\begin{matrix}w\\b\end{matrix}\right) \\&=\frac{1}{2}\left(\begin{matrix}w_1&w_2...&w_n&b\end{matrix}\right) \left(\begin{matrix}1&0&0&0&0\\0&1&0&0&0\\0&0&...&0&0\\0&0&0&1&0\\0&0&0&0&0\end{matrix}\right) \left(\begin{matrix}w_1\\w_2\\...\\w_n\\b\end{matrix}\right) \end{align}

b. 约束条件

⎛⎝⎜⎜⎜⎜y1(wTx1+b)y2(wTx2+b)...yl(wTxl+b)⎞⎠⎟⎟⎟⎟=⎛⎝⎜⎜⎜⎜y10000y20000...0000yl⎞⎠⎟⎟⎟⎟⎛⎝⎜⎜⎜⎜x11x21...xl1............x1nx2n...xln1111⎞⎠⎟⎟⎟⎟⎛⎝⎜⎜⎜w1...wnb⎞⎠⎟⎟⎟≥⎛⎝⎜⎜⎜1...11⎞⎠⎟⎟⎟

\begin{align} &\left(\begin{matrix}y_1(w^Tx^1+b)\\y_2(w^Tx^2+b)\\...\\y_l(w^Tx^l+b)\end{matrix}\right)=\left(\begin{matrix}y_1&0&0&0\\0&y_2&0&0\\0&0&...&0\\0&0&0&y_l\end{matrix}\right)\left(\begin{matrix}x_1^1&...&x_n^1&1\\x_1^2&...&x_n^2&1\\...&...&...&1\\x_1^l&...&x_n^l&1\end{matrix}\right)\left(\begin{matrix}w_1\\...\\w_n\\b\end{matrix}\right)\ge\left(\begin{matrix}1\\...\\1\\1\end{matrix}\right) \end{align}

2. 实现

(1) Matlab 2维版

这里把原优化问题作为二次规划问题求解。同理,也可以对它的对偶问题按二次规划问题求解。然而,该问题的规模正比于训练样本数,为避开高维数据计算的巨大开销,通常采用SMO方法[见 周志华, “机器学习”, pp. 124]。线性可分时,二次规划的解与工具箱的解 1相似。

clc;
clear;
close all;%%load fisheririsX = meas(1:100,[2,3]);
group = species(1:100);
[groupIdx, groupStr] = grp2idx(group);y = (groupIdx==1) * 2 - 1;[l,n] = size(X);H = eye(n + 1);
H(n + 1,n + 1) = 0;
f = zeros(n + 1,1);Z = [X ones(l,1)];
A = -diag(y) * Z;
c = -1 * ones(l,1);% 二次规划求解
w = quadprog(H,f,A,c);% 调整横轴范围,便于与工具箱效果比较
X1 = [2:5];
w1 = w(1,1);
w2 = w(2,1);
b = w(3,1);% 可分超平面:w1x1+w2x2+b=0 -> x2=-(w1*x1+b)/w2
Y1 = -(w1 * X1 + b) / w2;XPos = X(find(y==1),:);
XNeg = X(find(y==-1),:);% 超平面上界:w1x1+w2x2+b=1
YUP = (1 - w1 * X1 - b) / w2;
% 超平面上界:w1x1+w2x2+b=-1
YLOW = (-1 - w1 * X1 - b) / w2;figure(1);
set(gcf,'Color',[1,1,1]);
subplot(1,2,1);
plot(XPos(:,1),XPos(:,2),'r+'); hold on;
plot(XNeg(:,1),XNeg(:,2),'g*'); hold on;
plot(X1,Y1,'k-'); hold on;
plot(X1,YUP,'m:'); hold on;
plot(X1,YLOW,'m:');
legend('setosa','versicolor','hyperplane','upper margin','lower margin');% 调整纵轴范围,便于与工具箱效果比较
ylim([1,5.5]);title('svm trained with quadratic programming');
xlabel('sepal length');
ylabel('sepal width');
grid on;subplot(1,2,2);
svmStruct = svmtrain(X,group,'ShowPlot',true);
title('svm trained with matlab toolbox');
xlabel('sepal length');
ylabel('sepal width');
grid on;

注: 这里二次规划求解要求训练样本线性可分,否则找不到可行解。

(2) Matlab n维核函数版

工具箱自带预测器用到的参数 2有:

Alpha(α\alpha)——拉格朗日乘子
Beta(β\beta)——线性预测器的系数
Bias(bb)——偏置
KernelParameters.Scale(ss)——缩放因子

如果KernelParameters.Function为”Linear“,则输出为:

f(x)=(xs)′β+b

f(x)=\left(\frac{x}{s}\right)'\beta+b

更一般地,带核函数的预测输出可表示为:

f(x)=∑i=1mαiyiK(x,xi)+b

f(x)=\sum^{m}_{i=1}\alpha_iy_iK(x,x_i)+b
其中, yiy_i为第ii个支持向量xix_i的标签,mm为训练得到的支持向量的总数,K(x,xi)K(x,x_i)为测试样本xx与xix_i间的核函数输出。

clc;
clear;
close all;
%%load fisheririsX = meas(1:100,:);
group = species(1:100);
[groupIdx, groupStr] = grp2idx(group);Y = (groupIdx==2) * 2 - 1;XPos = X(find(Y==1),:);
XNeg = X(find(Y==-1),:);
%%cv = cvpartition(Y,'k',10);
err = zeros(cv.NumTestSets,1);for i = 1:cv.NumTestSetstrainIdx = cv.training(i);testIdx = cv.test(i);Xtrain = X(trainIdx,:);Ytrain = Y(trainIdx);Xtest = X(testIdx,:);Ytest = Y(testIdx);%% SVM 训练clf = fitcsvm(Xtrain,Ytrain,'KernelFunction','polynomial','ClassNames',[-1,1]);[m,n] = size(clf.SupportVectors);%% SVM 验证% (0) 线性核 'linear'% Ypred = (Xtest / clf.KernelParameters.Scale) * clf.Beta + clf.Bias > 0;Ypred = zeros(length(Xtest),1);for j=1:m% (1) 线性核 'linear'% Kernel = Xtest * clf.SupportVectors(j,:)'; % (2) 高斯核 'rbf'% Kernel = exp(-sum((Xtest - repmat(clf.SupportVectors(j,:),length(Xtest),1)).^2,2));% (3) 多项式核 'polynomial'Kernel = (1 + Xtest * clf.SupportVectors(j,:)').^clf.ModelParameters.KernelPolynomialOrder;Ypred = Ypred + clf.Alpha(j) * clf.SupportVectorLabels(j) * Kernel;endYpred = (Ypred + clf.Bias > 0) * 2 - 1;    err(i) = sum(~strcmp(Ypred,Ytest));
end
cvError = sum(err)/sum(cv.TestSize)
%%figure(1);
set(gcf,'Color',[1,1,1]);
%subplot(1,1,1);
plot(XPos(:,1),XPos(:,2),'ro'); hold on;
plot(XNeg(:,1),XNeg(:,2),'go'); hold on;
plot(Xtest(:,1),Xtest(:,2),'bo'); hold on;
plot(clf.SupportVectors(:,1),clf.SupportVectors(:,2),'k^'); hold on;[l,n] = size(Xtest);for i=1:lif Ypred(i)==1plot(Xtest(i,1),Xtest(i,2),'r*'); hold on;elseplot(Xtest(i,1),Xtest(i,2),'g*'); hold on;        end
endtitle('prediction with svm classifier');
xlabel('sepal length');
ylabel('sepal width');
grid on;

10折交叉验证 3后最后1折多项式核 4的预测结果如下图。其中三角形为支持向量,蓝色圆圈为验证样本,星型颜色和周围样本的颜色一致则分类正确。


(3) 转换

Matlab离线训练后得到分类器clf。线性核与高斯核预测时,保存支持向量即可;多项式核预测时,另外保存多项式的阶数。根据需要对预测部分转换成项目约束的语言即可。


FPGA视觉从入门到放弃——懒人的支持向量机相关推荐

  1. 校招总结—FPGA从入门到放弃

    校招总结-FPGA从入门到放弃 感谢咸鱼FPGA的授权转发,原文地址为https://www.cnblogs.com/xianyufpga/ 其实 offer 早就定下来了,最近忙着入党考试,现在才腾 ...

  2. 网络编程懒人入门(六):史上最通俗的集线器、交换机、路由器功能原理入门

    1.前言 即时通讯网整理了大量的网络编程类基础文章和资料,包括<TCP/IP协议 卷1>.<[通俗易懂]深入理解TCP协议>系列.<网络编程懒人入门>系列.< ...

  3. 网络编程懒人入门(三):快速理解TCP协议一篇就够

    1.前言 本系列文章的前两篇<网络编程懒人入门(一):快速理解网络通信协议(上篇)>.<网络编程懒人入门(二):快速理解网络通信协议(下篇)>快速介绍了网络基本通信协议及理论基 ...

  4. 网络编程懒人入门(二):快速理解网络通信协议(下篇)

    1.前言 本文上篇<网络编程懒人入门(一):快速理解网络通信协议(上篇)>分析了互联网的总体构思,从下至上,每一层协议的设计思想.基于知识连贯性的考虑,建议您先看完上篇后再来阅读本文. 本 ...

  5. 网络编程懒人入门(一):快速理解网络通信协议(上篇)

    1.写在前面 论坛和群里常会有技术同行打算自已开发IM或者消息推送系统,很多时候连基本的网络编程理论(如网络协议等)都不了解,就贸然定方案.写代码,显得非常盲目且充满技术风险. 即时通讯网论坛里精心整 ...

  6. 网络编程懒人入门(七):深入浅出,全面理解HTTP协议

    转自即时通讯网:http://www.52im.net/ 本文引用了自简书作者"涤生_Woo"的文章,内容有删减,感谢原作者的分享. 1.前言 HTTP(全称超文本传输协议,英文全 ...

  7. 网络编程懒人入门(九):通俗讲解,有了IP地址,为何还要用MAC地址?

    1.前言 标题虽然是为了解释有了 IP 地址,为什么还要用 MAC 地址,但是本文的重点在于理解为什么要有 IP 这样的东西.本文对读者的定位是知道 MAC 地址是什么,IP 地址是什么. (本文同步 ...

  8. 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接

    转自即时通讯网:http://www.52im.net/ 本文原作者:"水晶虾饺",原文由"玉刚说"写作平台提供写作赞助,原文版权归"玉刚说" ...

  9. 网络编程懒人入门系列目录集合

    原文链接:https://yq.aliyun.com/articles/633630 收起 本文原作者:"水晶虾饺",原文由"玉刚说"写作平台提供写作赞助,原文 ...

最新文章

  1. 在shell中编写函数
  2. 一个解决表单中的文字和文本区域(textarea)上对齐的方法
  3. elementui tree组件层级过多时可左右滚动
  4. php sql 条件拼组_ThinkPHP框架SQL操作链式写法原理(浅显易懂)
  5. 月亮之上--数学分析版
  6. superset出现A valid API access token is required to use Mapbox data
  7. 一个mysql复制中断的案例
  8. Spring高级之注解@DependsOn详解(超详细)
  9. 约会软件上的小姐姐,其实是StyleGAN生成的假人
  10. 网站主机 技术+类型
  11. mac python安装第三方库jupyter_Mac搭建jupyter环境
  12. revman软件_meta分析概述及RevMan软件安装教程
  13. 啊哈C语言 第七章 【代码】【习题答案】
  14. docker运维工具
  15. AutoCAD2007 快捷键介绍和线形设置
  16. HashMap的底层简单理解
  17. 实战Flash游戏开发
  18. ElementUI、sass、若依后台管理系统踩坑 --> 项目打包后字体图标偶发性乱码
  19. 股票:巧用均线多头排列选股
  20. ios动态效果实现翻页_iOS动画--翻页动画

热门文章

  1. java 火车算法_浅析12306售票算法(java版)
  2. GC433TR4模块性能超穿墙王SI4432无线收发模块
  3. Java中利用循环计算出s = a+aa+aaa+aaaa....,其中a为数字1~9中的任意一个,例如:a=5,计算出5+55+555+5555+55555的和(不可以使用Math.pow())
  4. iTunes备份路径Windows[Debug]
  5. PHP使用Laravel生成荣誉证书和往图片上写字
  6. 从阿里高层辞职想到的
  7. 中国十大IT行业名校
  8. 自定义控件,闪动文字FlickeringTextView
  9. 寒假之视频压缩笔记——FPGA视频拼接器的画中画和 视频窗口漫游功能分析
  10. 学软件开发为什么要选 “猿代码任务制培训模式”?