1. 一对多SVM分类器
对于多分类来说,一对多的SVM分类器思想是给定一类标上正标签,其余剩下的类标上负标签,对应的将训练40次。我们用细胞元组来将训练数据和测试数据存储起来。
- divdata.m函数负责将数据重新分配,即按上述我所说的
function data = divdata(index,X,n)
len = size(X,1);
if index == 1
data = [[X(1:n,:),ones(n,1)];[X(n+1:len,:),-ones(len-n,1)]];
elseif index == 80
data = [[X(1:len-n,:),-ones(len-n,1)];[X(len-n+1:len,:),ones(n,1)]];
else
data = [[X(1:n*(index-1),:),-ones(n*(index-1),1)];[X(n*index-n+1:n*index,:),ones(n,1)];[X(n*index+1:len,:),-ones(len-n*index,1)]];
end
end
- svmTrain.m是训练函数(这是实验五中的函数)
function svm = svmTrain(X,Y,C)
% Options是用来控制算法的选项参数的向量,optimset无参时,
% 创建一个选项结构所有字段为默认值的选项
options = optimset;
options.largeScale = 'off'; %LargeScale指大规模搜索,off表示在规模搜索模式关闭
options.Display = 'off'; %表示无输出
%二次规划用来求解问题,使用quadprog
n = length(Y);
%使用线性核
H = (Y.*X)*(Y.*X)';
H=(H+H')/2;
f = -ones(n,1); %f'为1*n个-1
A = [];
b = [];
Aeq = Y';
beq = 0;
lb = zeros(n,1);
ub = C*ones(n,1);
a0 = zeros(n,1); % a0是解的初始近似值
a = quadprog(H,f,A,b,Aeq,beq,lb,ub,a0,options);
epsilon = 1e-9;
sv_label = find(abs(a)> epsilon);
svm.sva = a(sv_label);
svm.Xsv = X(sv_label,:);
svm.Ysv = Y(sv_label);
svm.svnum = length(sv_label);
svm.a = a;
end
- test1.m主函数
%从人脸照片中随选择7张作为训练集
train_data = zeros(40*7,112*92);
test_data = zeros(40*3,112*92);
for i = 1:40
file_name = ['s',num2str(i)];
%随机选取同一文件夹下的7个图片
index = randperm(10);
for j = 1:7
%文件名拼接
name = ['att_faces\',file_name,'\',num2str(index(j)),'.pgm'];
image = double(imread(name));
%将矩阵展开为一行
train_data(7*(i-1)+j,:) = reshape(image,1,112*92);
end
for j = 1:3
%文件名拼接
name = ['att_faces\',file_name,'\',num2str(index(7+j)),'.pgm'];
image = double(imread(name));
test_data(3*(i-1)+j,:) = reshape(image,1,112*92);
end
end
%============