|
最近在学习Machine learning,尝试自己用Matlab实现SVM算法
svm基本思路是让分界的margin尽量大,可以转化为一个standard quadratic programming problem,这样在matlab中有就可以调用现成的函数解决
Code
- %svm demo
- %this m file can be used to solve unseparable problem
- clear;
- close all;
- clc;
- %positive points numbers
- Np = 15 ;
- %negative points numbers
- Nn = 15 ;
- %generate data
- [x, y] = gendata(Np, Nn) ;
- tol = 1e-4 ;
- %% build matrix for quadprog()
- [n m] = size(x); %m: number of train data; n: length of xi
- Y = diag(y);
- %%primal formulation
- %linear kernel
- K = x'*x;
- C = 1;
- H = Y*K*Y;
- f = -ones(m, 1);
- A = [];
- b = [];
- Aeq = y;
- beq = 0;
- l = zeros(m, 1);
- u = 1*ones(m, 1);
- options = optimset('Algorithm','interior-point-convex');
- %%standard quadratic programming problem X = quadprog(H,f,A,b,Aeq,beq,LB,UB,X0)
- alpha = quadprog(H, f, A, b, Aeq, beq, l, u, [], options);
- %%compute w
- w = zeros(n, 1);
- for i = 1 : m
- w = w + alpha(i)*y(i)*x(:, i);
- end
- %%compute b
- pos = find(alpha > 1e-6);
- b = mean(y(pos)- w'*x(:, pos));
- %%plot the boundry on the map
- xt = linspace(min(x(1, :)), max(x(2, :)), 100);
- yt = (-b-w(1)*xt)/w(2);
- yt_p = (1 -b -w(1)*xt)/w(2);
- yt_n = (-1 -b - w(1)*xt)/w(2);
- %%plot data
- xp = x(:, y == 1);
- xn = x(:, y == -1);
- figure;
- plot(xp(1, :), xp(2, :), 'ob', xn(1, :), xn(2, :), '*r');
- hold on;
- plot(xt, yt, '-r', xt, yt_n, '-b', xt, yt_p, '-b');
- hold off;
- print('-dpng', 'svm_soft_margin_simu.png')
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|