当前位置:文档之家› 模式识别第二次作业

模式识别第二次作业

模式识别第二次作业
模式识别第二次作业

模式识别第二次作业

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')

相关主题
文本预览
相关文档 最新文档