基于SVM人脸识别Matlab代码
function [nsv,al3,bi,T]=svm168(x,y,ker,C,par,tol); % 支持向量机在模式识别方面的应用.
% [nsv,al3,bi,T]=svm168(x,y,ker,C,par,tol); % 输入参数:
% x: 输入矩阵,每行代表一个样本,列数表示样本特征数。矩阵行数代表样本数 。
% y: 由 -1 或 +1组成的列向量. 每行表示相应样本的类别。只有两类。 % ker: 字符串 'linear', 'poly_h', 'poly_i' and 'rbf'。 % 用于传递内积函数的类型。 % C: 惩罚因子。
% par: 内积函数的参数。如多项式内积表示多项式的次数。查看kernel函数。 % tol: 算法的迭代误差。默认值是 10^-5。 % 输出:
% nsv: 支持向量个数. % al3: alpha值. % bi: 偏差值. % T: 运行时间.
% clear;clc;close all;
% disp('输入样本矩阵(每行表示一个测试数据):'); % x=[randn(1,20)-3 randn(1,20)+3;randn(1,40)]' % disp('样本所属类别:'); % y=[-ones(1,20) ones(1,20)]'
% [nsv,alpha,bias,T]=svm168(x,y,'linear',10); % fprintf('运行时间T=%g\\n',T); % fprintf('支持向量个数:%g\\n',nsv); % svcplot(x,y,'linear',alpha,bias); % W=x'*alpha;
% disp('权系数向量:'); % W
% disp('测试数据:');
% X_test=[randn(1,20)-3 randn(1,20)+3;randn(1,40)]' % disp('测试数据类别:');
% Y_test=[-ones(1,20) ones(1,20)]' % disp('测试数据类别判决:'); % Output=X_test*W+bias % disp('错误率:');
% number_error=sum(abs(Y_test-sign(Output)))/2; % error=number_error/20
% 径向基(或多项式)内积函数:(testrbf.m) % clear;clc;close all;
% disp('输入样本矩阵(每行表示一个测试数据):'); % x=[randn(1,20)-3 randn(1,20)+3;randn(1,40)]' % disp('样本所属类别:'); % y=[-ones(1,20) ones(1,20)]'
% [nsv,alpha,bias,T]=svm168(x,y,'rbf',10,4); % fprintf('运行时间T=%g\\n',T); % fprintf('支持向量个数:%g\\n',nsv); % svcplot(x,y,'linear',alpha,bias); % disp('测试数据:');
% X_test=[randn(1,20)-3 randn(1,20)+3;randn(1,40)]' % disp('测试数据类别:');
% Y_test=[-ones(1,20) ones(1,20)]' % disp('测试数据类别判决:');
Output=kernel('rbf',X_test,x(find(alpha),:),4)*alpha(find(alpha))+bias
% disp('错误率:');
% number_error=sum(abs(Y_test-sign(Output)))/2; % error=number_error/20
-------------------------------------------------------------------------
T=clock;
if (nargin<4 | nargin>6) help svm168 else
if(nargin==4 & ker(1)=='p') disp('将多项式内积的次数置为2。'); par=2;
elseif(nargin==4 & ker(1)=='r')
fprintf(1,'径向基函数内积的参数(方差)置为 %1.3f\\n',sqrt(size(x,2))); par=sqrt(size(x,2)); elseif(nargin==4) par=0; end
if(nargin<6) tol=10^-5; end K=10^6; N=size(x,1); ns=-1; k=2; hacer=1; bi=0;
H=kernel(ker,x,x,par); i1p=1:2:N; i1n=2:2:N; i1=[i1p i1n]'; a=zeros(N,1); a(i1)=C; al3=zeros(N,1); bi=0; i2p=[]; i2n=[]; Lp(1)=N*C; e=y;
while(hacer) al3_a=al3; bi_a=bi; al3=zeros(N,1); al3(i2p)=C; al3(i2n)=-C; if(length(i1))
Xi=inv([H(i1,i1)+diag(1./(a(i1)))
ones(length(i1),1);ones(1,length(i1)) 0]);