本文用通俗的语言解释MATLAB伪代码的支持向量机SVM核心代码,进而在癌症预测的应用。MATLAB的SVM,MATLAB自带SVM算法,因此,在这里通过MATLAB自带算法进行解释。本文的项目是两类人的预测,健康人,癌症患者,数据为基因表达数据。由于癌症患者前期的基因会发生变化,所以年度体检基因检测得到的基因表达数据可预测一年后的癌症发生概率。此项目具有实际的现实意义。是数据挖掘应用中的一个重要里程碑。
前提:由于SVM多处理非线性分类,如下:
SVM会通过以上核函数处理成以下形式,即对x进行了转化,变成线性可分。变成线性。
代码:svmtrain函数中
kx =feval_r(kfun,training,training,kfunargs{:});
% ensure function is symmetric
kx = (kx+kx')/2 +diag(1./boxconstraint);
以下x都为核函数转化后的x,下面的篇幅将按下述3点走:
1. 其实就要确定上述分类函数f(x) = w.x+b(w.x表示w与x的内积, 偏执b)中的两个参数w和b,通俗理解的话;
2. 那如何确定w?答案是寻找两条边界端或极端划分直线中间的最大间隔(为寻最大间隔,导出1/2||w||^2,求解方法很多,svm最基础的是用二次规划方法),从而确定最终的最大间隔分类函数;
首先第一点,举例X0到X的距离
SVM目的就是拟合出一条中间线,让所有的X离这条线最远。即
中间线还要在两类的中间,后面s.t的限制条件就是能让这条线在中间。求解的公式等价于
代码:svmtrain函数中
%X=QUADPROG(H,f,A,b,Aeq,beq,LB,UB,X0,opts)
[alpha, fval, exitflag, ...
output, lambda] =quadprog(H,-ones(nPoints,1),[],[],...
groupIndex',0,zeros(nPoints,1), ...
Inf *ones(nPoints,1),ones(nPoints,1), ...
qp_opts); %#ok
3. 进而把寻求分类函数f(x)= w.x+b的问题转化为对w的最优化问题,最终化为公式的求解。通过二次规划方法解出w值,进而得出最后的公式是f(x) = w.x+b。
由于f(x) = w.x+b转化成
代码:svmdecision函数
f =(feval_r(kfun,sv,Xnew,kfunargs{:})'*alphaHat(:)) + bias;
out = sign(f);
最终理解成其实就是将x进行维度转化后的y=ax的公式。
对预测的结果如图所示,其他两种优于SVM的算法是优化后的,有兴趣的可以联系我一起讨论。