《支持向量机作业》由会员分享,可在线阅读,更多相关《支持向量机作业(5页珍藏版)》请在金锄头文库上搜索。
1、clc clear close all% -% % 定义核函数及相关参数 C = 200; % 拉格朗日乘子上界 ker = struct(type,linear); %ker = struct(type,ploy,degree,3,offset,1); %ker = struct(type,gauss,width,1); %ker = struct(type,tanh,gamma,1,offset,0); % ker - 核参数(结构体变量) % the following fields: % type - linear : k(x,y) = x*y % poly : k(x,y) = (x
2、*y+c)d % gauss : k(x,y) = exp(-0.5*(norm(x-y)/s)2) % tanh : k(x,y) = tanh(g*x*y+c) % degree - Degree d of polynomial kernel (positive scalar). % offset - Offset c of polynomial and tanh kernel (scalar, negative for tanh). % width - Width s of Gauss kernel (positive scalar). % gamma - Slope g of the
3、tanh kernel (positive scalar). % -% % 构造两类训练样本 n = 50; randn(state,3); x1 = randn(n,2); y1 = ones(n,1); x2 = 5+randn(n,2); y2 = -ones(n,1); figure(1); plot(x1(:,1),x1(:,2),bx,x2(:,1),x2(:,2),k.); hold on; X = x1;x2; % 训练样本,nd 的矩阵,n 为样本个数,d 为样本维数 Y = y1;y2; % 训练目标,n1 的矩阵,n 为样本个数,值为+1 或-1 % -% % 训练支持向
4、量机 tic svm = C_SVC_Train(X,Y,C,ker); t_train = toc % svm 支持向量机(结构体变量) % the following fields: % ker - 核参数 % x - 训练样本 % y - 训练目标;% a - 拉格朗日乘子 % -% % 寻找支持向量 a = svm.a; epsilon = 1e-8; % 如果小于此值则认为是 0 i_sv = find(aepsilon); % 支持向量下标 plot(X(i_sv,1),X(i_sv,2),ro); % -% % 测试输出 x1,x2 = meshgrid(-2:0.05:7,-2
5、:0.05:7); rows,cols = size(x1); nt = rows*cols; % 测试样本数 Xt = reshape(x1,nt,1),reshape(x2,nt,1); tic Yd = C_SVC_Sim(svm,Xt); % 测试输出 t_sim = toc Yd = reshape(Yd,rows,cols); contour(x1,x2,Yd,0 0,m); % 分类面 hold off; function K = CalcKernel(ker,x,y) % Calculate kernel function.% % x: 输入样本,n1d 的矩阵,n1 为样本个
6、数,d 为样本维数 % y: 输入样本,n2d 的矩阵,n2 为样本个数,d 为样本维数 % % ker 核参数(结构体变量) % the following fields: % type - linear : k(x,y) = x*y % poly : k(x,y) = (x*y+c)d % gauss : k(x,y) = exp(-0.5*(norm(x-y)/s)2) % tanh : k(x,y) = tanh(g*x*y+c) % degree - Degree d of polynomial kernel (positive scalar). % offset - Offset
7、c of polynomial and tanh kernel (scalar, negative for tanh). % width - Width s of Gauss kernel (positive scalar). % gamma - Slope g of the tanh kernel (positive scalar). % % ker = struct(type,linear); % ker = struct(type,ploy,degree,d,offset,c); % ker = struct(type,gauss,width,s); % ker = struct(typ
8、e,tanh,gamma,g,offset,c); % % K: 输出核参数,n1n2 的矩阵 %-% % 转成列向量x = x; y = y; %-% switch ker.type case linear K = x*y; case ploy d = ker.degree; c = ker.offset; K = (x*y+c).d; case gauss s = ker.width; rows = size(x,2); cols = size(y,2);tmp = zeros(rows,cols); for i = 1:rows for j = 1:cols tmp(i,j) = nor
9、m(x(:,i)-y(:,j); end endK = exp(-0.5*(tmp/s).2); case tanh g = ker.gamma; c = ker.offset; K = tanh(g*x*y+c); otherwise K = 0; end function svm = C_SVC_Train(X,Y,C,ker) % 输入参数: % X 训练样本,nd 的矩阵,n 为样本个数,d 为样本维数 % Y 训练目标,n1 的矩阵,n 为样本个数,值为+1 或-1 % C 拉格朗日乘子上界 % ker 核参数(结构体变量) % the following fields: % typ
10、e - linear : k(x,y) = x*y % poly : k(x,y) = (x*y+c)d % gauss : k(x,y) = exp(-0.5*(norm(x-y)/s)2) % tanh : k(x,y) = tanh(g*x*y+c) % degree - Degree d of polynomial kernel (positive scalar). % offset - Offset c of polynomial and tanh kernel (scalar, negative for tanh). % width - Width s of Gauss kerne
11、l (positive scalar). % gamma - Slope g of the tanh kernel (positive scalar).% 输出参数: % svm 支持向量机(结构体变量) % the following fields: % ker - 核参数 % x - 训练样本 % y - 训练目标; % a - 拉格朗日乘子 % -% % 解二次优化 n = length(Y); H = (Y*Y).*Calckernel(ker,X,X); f = -ones(n,1); A = ; b = ; Aeq = Y; beq = 0; lb = zeros(n,1); ub
12、 = C*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 svm.ker = ker; svm.x = X; svm.y = Y; svm.a = a; function Yd = C_SVC_Sim(svm,Xt) % 输入参数: % svm 支持向量机
13、(结构体变量) % the following fields: % ker - 核参数 % type - linear : k(x,y) = x*y % poly : k(x,y) = (x*y+c)d % gauss : k(x,y) = exp(-0.5*(norm(x-y)/s)2) % tanh : k(x,y) = tanh(g*x*y+c) % degree - Degree d of polynomial kernel (positive scalar). % offset - Offset c of polynomial and tanh kernel (scalar, neg
14、ative for tanh). % width - Width s of Gauss kernel (positive scalar). % gamma - Slope g of the tanh kernel (positive scalar). % x - 训练样本% y - 训练目标; % a - 拉格朗日乘子 % % Xt 测试样本,nd 的矩阵,n 为样本个数,d 为样本维数% 输出参数: % Yd 测试输出,n1 的矩阵,n 为样本个数,值为+1 或-1% -%ker = svm.ker; X = svm.x; Y = svm.y; a = svm.a; % -% % 求 b epsilon = 1e-8;