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. 网页样式——各种炫酷效果持续更新ing...

    1.evanyou效果-彩带的实现,效果如下 注:这个主要用的是Canvas画布实现的,点击背景绘制新的图形,代码如下: /*Html代码:*/ <canvas id=">< ...

  2. mybatis缓存学习笔记

    mybatis有两级缓存机制,一级缓存默认开启,可以在手动关闭:二级缓存默认关闭,可以手动开启.一级缓存为线程内缓存,二级缓存为线程间缓存. 一提缓存,必是查询.缓存的作用就是查询快.写操作只能使得缓 ...

  3. 使用delegate实现简单的查询功能

    protected void imgbtnSearch_Click(object sender, System.Web.UI.ImageClickEventArgs e) { string keyWo ...

  4. 十天冲刺---Day5

    站立式会议 站立式会议内容总结: 燃尽图 照片 PM确实不应该交给组内编码最强的人来做. 编码的过程还要考虑整个项目的流程压力较大. 需要队友的支持和沟通.

  5. [转]Hibernate与Jpa的关系,终于弄懂

    原文地址:http://blog.sina.com.cn/s/blog_5f1619e80100yoxz.html 我知道Jpa是一种规范,而Hibernate是它的一种实现.除了Hibernate, ...

  6. swift 学习(一)基础知识 (基本数据类型,操作符,流控制,集合)

    xcode 中调用API帮助 1.查看简单信息,选中后 按键 control +左键单击  或者按 右侧属性栏 里的帮助按钮 2.完整API,选中后 按键 control +左键双击 3.查看类.函数 ...

  7. HTTP 405 错误 – 方法不被允许 (Method not allowed)

    HTTP 协议定义一些方法,以指明为获取客户端(如您的浏览器或我们的 CheckUpDown 机器人)所指定的具体网址资源而需要在 Web 服务器上执行的动作.则这些方法如下: 介绍 OPTIONS( ...

  8. Xmanager注册吗

    xmanager4.0注册吗 --

  9. Android大神博客

    Trinea  收藏级,开源项目分析等 Android开发周刊Android各种知识 郭霖 http://blog.csdn.net/guolin_blog?viewmode=contents 鸿洋  ...

  10. skiing

    package noj_skiing; import java.util.*; import java.math.*; public class Main { public static void m ...