SMO的数学公式通过Platt的论文和看这个博客:http://www.cnblogs.com/jerrylead/archive/2011/03/18/1988419.html,大概弄懂了。推导以后再写,贴上一个自己写的SMO的代码。

function [ model ] = smoSolver( designMatrix, targetGroup )
numChanged = 0;
examineAll = 1;
tolerance = 0.001; total_runtimes = 5000; epsilon = 0.01;
n_samps = size(designMatrix,1);
kernelMatrix = zeros(n_samps, n_samps);
for i = 1 : n_samps
for j = i : n_samps
kernelMatrix(i,j) = dot(designMatrix(i,:), designMatrix(j,:));
kernelMatrix(j,i) = kernelMatrix(i,j);
end
end
alphaArray = rand(1, n_samps);
C = 1; b = 0;
u = alphaArray .* targetGroup * kernelMatrix - b;
E = u - targetGroup;
iter = 1 ;
while(numChanged > 0 || examineAll)
numChanged = 0;
if(examineAll)
for i = 1 : n_samps
numChanged = numChanged + examineExample(i);
end
else
for i = 1 : n_samps
if abs(alphaArray(i)) > tolerance && abs(alphaArray(i)-C) > tolerance
numChanged = numChanged + examineExample(i);
end
end
end
if(examineAll == 1)
examineAll = 0;
elseif (numChanged == 0)
examineAll = 1;
end
iter = iter + 1;
if iter > total_runtimes
break;
end
end function changed = examineExample(i)
y2 = targetGroup(i);
alpha2 = alphaArray(i);
E2 = E(i);
r2 = E2 * y2;
%if((r2 < -0.01 && alpha2 < C) || (r2 > 0.01 && alpha2 > 0))
if( (r2 < -tolerance && abs(alpha2) < tolerance) || ...
(r2 > tolerance && abs(alpha2-C) < tolerance) || ...
(abs(r2) > tolerance && alpha2 < C-tolerance && alpha2 > tolerance ) )
non_zero_non_c = find(abs(alphaArray)>0.01 & abs(alphaArray-C)>0.01);
if length(non_zero_non_c) > 1
maxIdx = 1; max = 0;
for idx = 1 : n_samps
if abs(E(idx) - E2) > max
max = abs(E(idx) - E2);
maxIdx = idx;
end
end
if takeStep(maxIdx, i)
changed = 1; return;
end
end for k = 1 : length(non_zero_non_c)
i1 = non_zero_non_c(k);
if takeStep(i1, i);
changed = 1; return;
end
end for k = 1 : n_samps
if takeStep(k, i)
changed = 1; return;
end
end
end
changed = 0; return;
end function tf = takeStep(i1, i2)
if i1 == i2
tf = 0; return;
end alpha1 = alphaArray(i1); a1 = 0;
alpha2 = alphaArray(i2); a2 = 0;
y1 = targetGroup(i1); y2 = targetGroup(i2);
E1 = E(i1); E2 = E(i2);
s = y1 * y2;
if s > 0
L = max([0,alpha1+alpha2-C]);
H = min([C,alpha1+alpha2]);
else
L = max([0,alpha2-alpha1]);
H = min([C, C+alpha2-alpha1]);
end if L == H
tf = 0; return;
end
k11 = kernelMatrix(i1,i1);
k12 = kernelMatrix(i1,i2);
k22 = kernelMatrix(i2,i2);
eta = k11 + k22 - 2*k12;
if(eta > 0)
a2 = alpha2 + y2 * (E1-E2)/eta;
if(a2 < L)
a2 = L;
elseif (a2 > H)
a2 = H;
end
else
a2 = L;
a1 = alpha1 + s*(alpha2-a2);
alphaArrayTmp = alphaArray; alphaArrayTmp(i1) = a1; alphaArrayTmp(i2) = a2;
alphaArrayTmp = alphaArrayTmp .* targetGroup;
Lobj = 0.5 * alphaArrayTmp * kernelMatrix * alphaArrayTmp' - sum(alphaArrayTmp); a2 = H;
a1 = alpha1 + s*(alpha2-a2);
alphaArrayTmp = alphaArray; alphaArrayTmp(i1) = a1; alphaArrayTmp(i2) = a2;
alphaArrayTmp = alphaArrayTmp .* targetGroup;
Hobj = 0.5 * alphaArrayTmp * kernelMatrix * alphaArrayTmp' - sum(alphaArrayTmp);
if(Lobj < Hobj - epsilon)
a2 = L;
elseif(Lobj > Hobj + epsilon)
a2 = H;
else
a2 = alpha2;
end
end
if (abs(a2-alpha2) < 0.01*(a2+alpha2+epsilon))
tf = 0; return;
end a1 = alpha1 + s*(alpha2-a2); b1 = E1 + y1*(a1 - alpha1)*kernelMatrix(i1,i1)+y2*(a2 - alpha2)*kernelMatrix(i1,i2)+b;
b2 = E2 + y1*(a1 - alpha1)*kernelMatrix(i1,i2)+y2*(a2 - alpha2)*kernelMatrix(i2,i2)+b;
if(a1 > 0 && a1 < C)
b = b1;
elseif(a2 > 0 && a2 < C)
b = b2;
else
b = (b1+b2)/2;
end
alphaArray(i1) = a1; alphaArray(i2) = a2; u = alphaArray .* targetGroup * kernelMatrix - b;
E = u - targetGroup; tf = 1; return;
end u = alphaArray .* targetGroup * kernelMatrix - b;
alphaIdx = find(abs(alphaArray) > tolerance);
model.targetGroup = targetGroup(alphaIdx);
model.alpha = alphaArray(alphaIdx);
model.supVec = designMatrix(alphaIdx, :);
model.b = b; end

smoPredict:

function [ targetGroup ] = smoPredict( model, designMatrix )
kernelMatrix = model.supVec * designMatrix';
u = sum(kernelMatrix' .* model.alpha .* model.targetGroup) - model.b;
targetGroup = sign(u);
end

SMO推导和代码-记录毕业论文4的更多相关文章

  1. 《神经网络的梯度推导与代码验证》之CNN的前向传播和反向梯度推导

    在FNN(DNN)的前向传播,反向梯度推导以及代码验证中,我们不仅总结了FNN(DNN)这种神经网络结构的前向传播和反向梯度求导公式,还通过tensorflow的自动求微分工具验证了其准确性.在本篇章 ...

  2. 《神经网络的梯度推导与代码验证》之CNN前向和反向传播过程的代码验证

    在<神经网络的梯度推导与代码验证>之CNN的前向传播和反向梯度推导 中,我们学习了CNN的前向传播和反向梯度求导,但知识仍停留在纸面.本篇章将基于深度学习框架tensorflow验证我们所 ...

  3. MVVM 代码记录

      一.XML <Page x:Class="MVVM.MainPage" xmlns="http://schemas.microsoft.com/winfx/20 ...

  4. 《神经网络的梯度推导与代码验证》之FNN(DNN)的前向传播和反向推导

    在<神经网络的梯度推导与代码验证>之数学基础篇:矩阵微分与求导中,我们总结了一些用于推导神经网络反向梯度求导的重要的数学技巧.此外,通过一个简单的demo,我们初步了解了使用矩阵求导来批量 ...

  5. 《神经网络的梯度推导与代码验证》之FNN(DNN)前向和反向过程的代码验证

    在<神经网络的梯度推导与代码验证>之FNN(DNN)的前向传播和反向梯度推导中,我们学习了FNN(DNN)的前向传播和反向梯度求导,但知识仍停留在纸面.本篇章将基于深度学习框架tensor ...

  6. 《神经网络的梯度推导与代码验证》之vanilla RNN的前向传播和反向梯度推导

    在本篇章,我们将专门针对vanilla RNN,也就是所谓的原始RNN这种网络结构进行前向传播介绍和反向梯度推导.更多相关内容请见<神经网络的梯度推导与代码验证>系列介绍. 注意: 本系列 ...

  7. 《神经网络的梯度推导与代码验证》之vanilla RNN前向和反向传播的代码验证

    在<神经网络的梯度推导与代码验证>之vanilla RNN的前向传播和反向梯度推导中,我们学习了vanilla RNN的前向传播和反向梯度求导,但知识仍停留在纸面.本篇章将基于深度学习框架 ...

  8. 《神经网络的梯度推导与代码验证》之LSTM的前向传播和反向梯度推导

    前言 在本篇章,我们将专门针对LSTM这种网络结构进行前向传播介绍和反向梯度推导. 关于LSTM的梯度推导,这一块确实挺不好掌握,原因有: 一些经典的deep learning 教程,例如花书缺乏相关 ...

  9. 借One-Class-SVM回顾SMO在SVM中的数学推导--记录毕业论文5

    上篇记录了一些决策树算法,这篇是借OC-SVM填回SMO在SVM中的数学推导这个坑. 参考文献: http://research.microsoft.com/pubs/69644/tr-98-14.p ...

随机推荐

  1. latex中页面距离的设置

    1.页面设置 a4 会给你一个较小的页面,为了使用更多的控制,可用 geometry宏包和命令 \layout . 2.改变长度 在latex里改变长度的命令是 \addtolength 和 \set ...

  2. [转]MyBatis传入多个参数的问题 - mingyue1818

    原文  http://www.cnblogs.com/mingyue1818/p/3714162.html 一.单个参数: public List<XXBean> getXXBeanLis ...

  3. iOS -- 神战

    http://github.ibireme.com/github/list/ios/# https://github.com/Tim9Liu9/TimLiu-iOS http://www.ios122 ...

  4. linux基础学习2

    http://www.chengzhier.com <a href="http://www.chengzhier.com">橙汁儿网</a> 1. date ...

  5. ubuntu14.04 安装配置JDK1.7

    1,下载jdk-7u45-linux-x64.tar.gz 网址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downlo ...

  6. PHP 解析 ElasticSearch 的 json 方法,有關遍歷所有 json 元素

    以下是eleasticsearch返回的json資料:{"took" : 12,"timed_out" : false,"_shards" ...

  7. 【BZOJ 4515】【SDOI 2016 Round1 Day1 T3】游戏

    考场上写了lct,可惜当时对标记永久化的理解并不是十分深刻,导致调一个错误的程序调了4h+,最后这道题爆0了QwQ 现在写了树链剖分,用标记永久化的线段树维护轻重链,对于$s\rightarrow l ...

  8. python之旅【第一篇】

    python简介 python的起源 追溯Python语言的起源,是从20世纪90年代初由Guido van Rossum,在阿姆斯特丹,开发一个新的脚本解释程序.不知道Guido当初有没有想到,Py ...

  9. 去掉iPhone、iPad的默认按钮样式 去掉高光样式:

    input[type="button"], input[type="submit"], input[type="reset"] { -web ...

  10. 使用Apache Archiva搭建Maven Repository Server

    关于 Maven 私服 的搭建 这里 采用 Apache Archiva 的 Standanlone 模式来安装 1) 首先到archiva主页上下载最新版(Archiva 2.2.1 Standal ...