模式识别第二次作业
1、调用 seqminopt.m 函数(matlab 工具箱函数)替代 svm_matlab 中的fmincon 函数。
seqminopt函数的调用方法如下形式:
[ALPHA OFFSET] = seqminopt(TRAINING,Y,BOXC,KERNELFUNC,SMOOPTIONS)
W_fmincon =
0.1581
0.3100
0.0900
用seqminopt替换fmincon后结果为:
W_seqminopt =
0.1581
0.3100
0.0900
可以发现两种形式下结果是一样的。设置100个离散点,分类结果为:
程序
close all;
clear all;
clc
%生成训练数据
Obj1.NTrain = 100;
Obj1.mean = 1 * [3; 5];
Obj1.SampTrain = randn(2, Obj1.NTrain) + kron(Obj1.mean, ones(1, Obj1.NTrain));
Obj1.NTest = 50;
Obj1.SampTest = randn(2, Obj1.NTest) + kron(Obj1.mean, ones(1, Obj1.NTest));
Obj2.NTrain = 100;
Obj2.mean = -1 * [3; 5];
Obj2.SampTrain = randn(2, Obj2.NTrain) + kron(Obj2.mean, ones(1, Obj2.NTrain));
Obj2.NTest = 50;
Obj2.SampTest = randn(2, Obj2.NTest) + kron(Obj2.mean, ones(1, Obj2.NTest));
TestMatrix = zeros(2);
cnt_c1 = 1;
cnt_c2 = 1;
tt = 1 : 1000;
tt = (tt - 500) * 0.01;
figure;
plot(Obj1.SampTrain(1, :), Obj1.SampTrain(2, :), 'bo', 'linewidth', 2, 'markersize', 5)
hold on;
plot(Obj2.SampTrain(1, :), Obj2.SampTrain(2, :), 'ko', 'linewidth', 2, 'markersize', 5)
%要训练的数据及其类别
cnt = 1;
X = zeros(Obj1.NTrain + Obj1.NTrain, 3);
for iii = 1 : Obj1.NTrain
X(cnt, 1 : 2) = Obj1.SampTrain(:, iii);
X(cnt, 3) = 1;
y(cnt, 1) = 1;
cnt = cnt + 1;
end
for iii = 1 : Obj2.NTrain
X(cnt, 1 : 2) = Obj2.SampTrain(:, iii);
X(cnt, 3) = 1;
y(cnt, 1) = -1;
cnt = cnt + 1;
end
%替换为seqminopt后不用下面这个
cnt = 1;
Xsvm = zeros(Obj1.NTrain + Obj1.NTrain, 3);
for iii = 1 : Obj1.NTrain
Xsvm(cnt, 1 : 2) = -1 * Obj1.SampTrain(:, iii);
Xsvm(cnt, 3) = -1 * 1;
ysvm(cnt, 1) = -1;
cnt = cnt + 1;
end
for iii = 1 : Obj2.NTrain
Xsvm(cnt, 1 : 2) = Obj2.SampTrain(:, iii);
Xsvm(cnt, 3) = 1;
ysvm(cnt, 1) = -1;
cnt = cnt + 1;
end
%%%%%%%%%%%%%%%%%%%%%%%%%
%下面就是替换为seqminopt
traindata=X(:, 1 : 2);%用X而不是Xsvm
trainlabel=y;%用y而非ysvm
boxConstraints= ones(size(trainlabel));%松弛变量,我默认为1
kfun = @linear_kernel;%线性函数句柄
[alphas, bias] = seqminopt(traindata,trainlabel, boxConstraints, kfun);
svIndex = find(alphas > sqrt(eps));%寻找支持向量的索引
sv =traindata(svIndex,:);%对应x(i)
alphaHat = trainlabel(svIndex).*alphas(svIndex);%对应y(i)*α(i)
weight=zeros(1,2);%W=sum(y(i)*α(i)*x(i))
for i=1:length(svIndex)
weight=weight+alphaHat(i)*sv(i,:);
end
W=zeros(3,1);
W(1:2)=weight;W(3)=bias;
W_seqminopt=W%用来做对比
%%%%%%%%%%%%%%%%%%%%%%
fmincon_options = optimset('Algorithm','interior-point', ...
'MaxIter', 50);
[W1, val, exflag, output] = fmincon(@(x)(norm(x(1 : 2), 2)),[0; 0;
Xsvm,ysvm,[],[],[],[], [], fmincon_options);
W_fmincon=W1%做对比%%%%%%%%%%%%%%%%%%%%%%%%%
for kkk = 1 : Obj1.NTest
TMP_Tr(1:2, 1) = Obj1.SampTest(:, kkk);
TMP_Tr(3, 1) = 1;
yy = W.' * TMP_Tr;
if (yy > 0)
Result_c1(:, cnt_c1) = Obj1.SampTest(:, kkk);
cnt_c1 = cnt_c1 + 1;
TestMatrix(1, 1) = TestMatrix(1, 1) + 1;
else
Result_c2(:, cnt_c2) = Obj1.SampTest(:, kkk);
cnt_c2 = cnt_c2 + 1;
TestMatrix(1, 2) = TestMatrix(1, 2) + 1;
end
end
for kkk = 1 : Obj2.NTest
TMP_Tr(1:2, 1) = Obj2.SampTest(:, kkk);
TMP_Tr(3, 1) = 1;
yy = W.' * TMP_Tr;
if (yy > 0)
Result_c1(:, cnt_c1) = Obj2.SampTest(:, kkk);
cnt_c1 = cnt_c1 + 1;
TestMatrix(2, 1) = TestMatrix(2, 1) + 1;
else
Result_c2(:, cnt_c2) = Obj2.SampTest(:, kkk);
cnt_c2 = cnt_c2 + 1;
TestMatrix(2, 2) = TestMatrix(2, 2) + 1;
end
end
TestMatrix(1, :) = TestMatrix(1, :) / Obj1.NTest;
TestMatrix(2, :) = TestMatrix(2, :) / Obj2.NTest;
TestMatrix
figure;
try
plot(Result_c1(1, :), Result_c1(2, :), 'bo', 'linewidth', 2, 'markersize', 5)
end
try
plot(Result_c2(1, :), Result_c2(2, :), 'ko', 'linewidth', 2, 'markersize', 5)
end
% plot(Obj1.SampTrain(1, :), Obj1.SampTrain(2, :), 'r+', 'linewidth', 2, 'markersize', 10)
%
% plot(Obj2.SampTrain(1, :), Obj2.SampTrain(2, :), 'b+', 'linewidth', 2, 'markersize', 10)
WW = W;
WW = WW / norm(WW);
plot(tt , -1 * (WW(1) / WW(2) * tt + WW(3) / WW(2)), 'linewidth', 2) xlabel('x_1')
ylabe('x_2')