今天调试了一下非线性核的SVM  并粗略显示一下分界线

 

线性核  分界线

 

 

径向基核  分界线             可以看出非线性核可以拟合非线性曲线(对应 核空间中的线性曲线)

 

 

 

代码如下  还有部分小bug  例如有时候随机生成的数据 对应奇异矩阵  解二次规划 解不出来    此时可以重新运行

 

代码

Code

 

 

 

 1function result=CalcValueBySVM(svm, x)
 2
 3
 4result=svm.b;
 5
 6n=size(svm.y);
 7
 8for j=1:n
 9    result=result+ svm.a(j)*svm.y(j)*CalcKernel(svm.ker, x, svm.x(j,:));
10end
11
12
13

 

 

SVM_Test

 

 补充以前漏的,呵呵,刚刚调试出来的


代码
%---------------- author: feathersky----------------

function svm
=SVM_DivideTwoClass(ker, X,Y)

% 解二次优化方城
= length(Y);
 
%= (Y*Y').*(X*X'); % liner kernel
= (Y*Y').*CalcKernel(ker,X,X); %  kernel
= -ones(n,1);
= [];
= [];
Aeq 
= Y';
beq = 0;
lb 
= zeros(n,1);
ub 
= 1000*ones(n,1);
a0 
= zeros(n,1);
options 
= optimset;
options.LargeScale 
= 'off';
options.Display 
= 'off';
[a,fval,eXitflag,output,lambda] 
= quadprog(H,f,A,b,Aeq,beq,lb,ub,a0,options);
eXitflag

svm.ker
=ker;
svm.x
=X;
svm.y
=Y;
svm.a
=a;



% aLarge=find(a>0.01);    %找到第一个不等于0的a ,   
% j=aLarge(1);
% svm.b=Y(j)-CalcKernel(ker,X(j,:),w);


% ------------------------------------------------------------%%
% 求 b
epsilon 
= 1e-8% 如果小于此值则认为是0
i_sv 
= find(a>epsilon); % 支持向量下标
tmp 
= (Y.*a)'*CalcKernel(ker,X,X(i_sv,:)); % 行向量
= 1./Y(i_sv)-tmp';
= mean(b);
svm.b
=b
fprintf(
'Construct function Y = sign(tmp+b):')

% ------------------------------------------------------------%











 

posted on 2009-06-18 17:24  feathersky  阅读(12123)  评论(7编辑  收藏  举报