SMO推导和代码-记录毕业论文4
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的更多相关文章
- 《神经网络的梯度推导与代码验证》之CNN的前向传播和反向梯度推导
在FNN(DNN)的前向传播,反向梯度推导以及代码验证中,我们不仅总结了FNN(DNN)这种神经网络结构的前向传播和反向梯度求导公式,还通过tensorflow的自动求微分工具验证了其准确性.在本篇章 ...
- 《神经网络的梯度推导与代码验证》之CNN前向和反向传播过程的代码验证
在<神经网络的梯度推导与代码验证>之CNN的前向传播和反向梯度推导 中,我们学习了CNN的前向传播和反向梯度求导,但知识仍停留在纸面.本篇章将基于深度学习框架tensorflow验证我们所 ...
- MVVM 代码记录
一.XML <Page x:Class="MVVM.MainPage" xmlns="http://schemas.microsoft.com/winfx/20 ...
- 《神经网络的梯度推导与代码验证》之FNN(DNN)的前向传播和反向推导
在<神经网络的梯度推导与代码验证>之数学基础篇:矩阵微分与求导中,我们总结了一些用于推导神经网络反向梯度求导的重要的数学技巧.此外,通过一个简单的demo,我们初步了解了使用矩阵求导来批量 ...
- 《神经网络的梯度推导与代码验证》之FNN(DNN)前向和反向过程的代码验证
在<神经网络的梯度推导与代码验证>之FNN(DNN)的前向传播和反向梯度推导中,我们学习了FNN(DNN)的前向传播和反向梯度求导,但知识仍停留在纸面.本篇章将基于深度学习框架tensor ...
- 《神经网络的梯度推导与代码验证》之vanilla RNN的前向传播和反向梯度推导
在本篇章,我们将专门针对vanilla RNN,也就是所谓的原始RNN这种网络结构进行前向传播介绍和反向梯度推导.更多相关内容请见<神经网络的梯度推导与代码验证>系列介绍. 注意: 本系列 ...
- 《神经网络的梯度推导与代码验证》之vanilla RNN前向和反向传播的代码验证
在<神经网络的梯度推导与代码验证>之vanilla RNN的前向传播和反向梯度推导中,我们学习了vanilla RNN的前向传播和反向梯度求导,但知识仍停留在纸面.本篇章将基于深度学习框架 ...
- 《神经网络的梯度推导与代码验证》之LSTM的前向传播和反向梯度推导
前言 在本篇章,我们将专门针对LSTM这种网络结构进行前向传播介绍和反向梯度推导. 关于LSTM的梯度推导,这一块确实挺不好掌握,原因有: 一些经典的deep learning 教程,例如花书缺乏相关 ...
- 借One-Class-SVM回顾SMO在SVM中的数学推导--记录毕业论文5
上篇记录了一些决策树算法,这篇是借OC-SVM填回SMO在SVM中的数学推导这个坑. 参考文献: http://research.microsoft.com/pubs/69644/tr-98-14.p ...
随机推荐
- mysql 启动失败
1 mysql 启动时报:MySQL Daemon failed to start.并且启动失败 2 查看mysql log日志 less /var/log/mysqld.log 3 从两行erro ...
- mybatis resultMap映射学习笔记
这几天,百度mybatis突然看不到官网了,不知道百度怎么整的.特此贴出mybatis中文官网: http://www.mybatis.org/mybatis-3/zh/index.html 一个学习 ...
- shell读取文件内容
Shell脚本,执行解释速度快.代码简单易于理解.在shell代码编写过程中,经常会用到读取文件内容. 写法一: ------------------------------------ ...
- Putty SSH简单使用
本地的puttygen生出的秘钥,公钥传到服务器上连接会报错 Server refused our key. 一般我们建议都在服务器上生成秘钥,把私钥下载下来.加载到putty认证中 01.在服务器上 ...
- [转] easyui 获取数据表格中选中行的数据 Get selected row data from...
原文地址:http://my.oschina.net/meSpace/blog/41463 http://www.easyui.net/2010/06/easyui-tutorial-get-sele ...
- idea 新建web项目
- 【BZOJ 3049】【USACO2013 Jan】Island Travels BFS+状压DP
这是今天下午的互测题,只得了60多分 分析一下错因: $dis[i][j]$只记录了相邻的两个岛屿之间的距离,我一开始以为可以,后来$charge$提醒我有可能会出现来回走的情况,而状压转移就一次,无 ...
- VS 2013 未找到与约束contractname Microsoft.VisualStudio.Utilities.IContentTypeRegistryService...匹配的导出[vs故障]【转】
未找到与约束 contractname Microsoft.VisualStudio.Utilities.IContentTypeRegistryService RequiredTypeIdentit ...
- git初体验(四)git标签
1.git 标题(tag) 关于git标签的描述,参考这里 2.标题管理 创建: 切换到需要打标签的分支上,如: git checkout master git tag v1.0 # 默认标签是打在最 ...
- SurfaceView, TextureView, SurfaceTexture等的区别
SurfaceView, GLSurfaceView, SurfaceTexture以及TextureView是Android当中名字比较绕,关系又比较密切的几个类.本文基于Android 5.0(L ...