视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
支持向量机作业
2025-09-30 22:40:59 责编:小OO
文档
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'*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 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]; % 训练样本,n×d的矩阵,n为样本个数,d为样本维数

Y = [y1;y2]; % 训练目标,n×1的矩阵,n为样本个数,值为+1或-1

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

% 训练支持向量机

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(a>epsilon); % 支持向量下标

plot(X(i_sv,1),X(i_sv,2),'ro');

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

% 测试输出

[x1,x2] = meshgrid(-2:0.05:7,-2: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: 输入样本,n1×d的矩阵,n1为样本个数,d为样本维数

% y: 输入样本,n2×d的矩阵,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 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('type','tanh','gamma',g,'offset',c);

%

% K: 输出核参数,n1×n2的矩阵

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

% 转成列向量

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) = norm(x(:,i)-y(:,j));

end

end

 K = 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 训练样本,n×d的矩阵,n为样本个数,d为样本维数

% Y 训练目标,n×1的矩阵,n为样本个数,值为+1或-1

% C 拉格朗日乘子上界

% 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 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).

% 输出参数:

% 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 = 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 支持向量机(结构体变量)

% 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, negative for tanh).

% width - Width s of Gauss kernel (positive scalar).

% gamma - Slope g of the tanh kernel (positive scalar).

% x - 训练样本

% y - 训练目标;

% a - 拉格朗日乘子

%

% Xt 测试样本,n×d的矩阵,n为样本个数,d为样本维数

% 输出参数:

% Yd 测试输出,n×1的矩阵,n为样本个数,值为+1或-1

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

ker = svm.ker;

X = svm.x;

Y = svm.y;

a = svm.a;

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

% 求 b

epsilon = 1e-8; % 如果小于此值则认为是0

i_sv = find(a>epsilon); % 支持向量下标

tmp = (Y.*a)'*Calckernel(ker,X,X(i_sv,); % 行向量

b = 1./Y(i_sv)-tmp';

b = mean(b);

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

% 测试输出

nt = size(Xt,1); % 测试样本数

tmp = (Y.*a)'*Calckernel(ker,X,Xt);

Yd = sign(tmp+b)';下载本文

显示全文
专题