SVM实现

本文转载自:http://blog.youkuaiyun.com/lifeitengup/article/details/10951655

#翻译#了下 余凯老师的 心法

以前的一篇博文:二分类SVM方法Matlab实现



前几日实现了下,虽然说是Linear-SVM,但是只要可以有映射函数也可以做kernel-svm





[plain]  view plain  copy
  1. function [optW cost]= svm5step(X, y, lambda)  
  2. %% Linear-SVM Minimize(Cost + lambda*Penalty)  
  3. % X: N×dim  
  4. % y: {-1,+1}  
  5. % lambda: coefficient for Penalty part    
  6. % By LiFeiteng Email:lifeiteng0422@gmail.com   
  7.   
  8. [N dim] = size(X);  
  9. w = rand(dim+1,1);  
  10. X = [ones(N,1) X]; % x = [1 x]  
  11.   
  12. % minFunc From: http://www.di.ens.fr/~mschmidt/Software/minFunc.html  
  13. options.Method = 'lbfgs';  
  14. options.maxIter = 100;      
  15. options.display = 'on';  
  16. [optW, cost] = minFunc( @(p) svmCost(p, X, y, lambda), w, options);  
  17.   
  18. end  
  19.   
  20. function [cost grad] = svmCost(w, X, y, lambda)  
  21. % cost = HingeLoss^2 + lambda*||w||^2  
  22. % 1 2 3 4 5 step  
  23. yp = X*w;  
  24. idx = find(yp.*y<1);  
  25. err = yp(idx)-y(idx);  
  26. cost = err'*err + lambda*w'*w;  
  27. grad = 2*X(idx,:)'*err + 2*lambda*w;  
  28. end  


测试用例:

[plain]  view plain  copy
  1. clear  
  2. close all  
  3. x0 = [1 4]';  
  4. x1 = [4 1]';  
  5.   
  6. X0 = [];  
  7. X1 = [];  
  8. for i = 1:40  
  9.     X0 = [X0 normrnd(x0, 1)];  
  10.     X1 = [X1 normrnd(x1, 1)];  
  11. end  
  12. X = [X0 X1]';  
  13. y = [-ones(size(X0,2),1); ones(size(X1,2),1)];  
  14. save data X0 X1 X y  
  15.   
  16. plot(X0(1,:),X0(2,:), 'ko', 'MarkerFaceColor', 'y', 'MarkerSize', 7);  
  17. hold on  
  18. plot(X1(1,:),X1(2,:), 'k+','LineWidth', 2, 'MarkerSize', 7);  
  19.   
  20. lambda = 0.01;  
  21. w = svm5step(X, y, lambda)  
  22. k = -w(2)/w(3); b = -w(1)/w(3);  
  23. h = refline(k,b); %已知斜率w 截距b 画直线  
  24. set(h, 'Color', 'r')  
  25.   
  26. b = -(w(1)+1)/w(3);  
  27. h = refline(k,b); %已知斜率w 截距b 画直线  
  28. b = -(w(1)-1)/w(3);  
  29. h = refline(k,b); %已知斜率w 截距b 画直线  
  30. title(['5 steps Linear-SVM: \lambda = ' num2str(lambda)] )  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值