clear;clc
offset = 0.1;
pdata = [rand(300,2) + offset + 1; ...
rand(300,2) + offset + repmat([1, 0], 300, 1);...
rand(300,2) + offset + repmat([0, 1], 300, 1)];
ndata = rand(900,2) - offset;%-repmat([.5, .5], 60, 1) .* (rand(60,2) - 0.2);
ptestdata = [rand(20,2) + offset + 1; ...
rand(20,2) + offset + repmat([1, 0], 20, 1);...
rand(20,2) + offset + repmat([0, 1], 20, 1)];%repmat([0.5, .5], 10, 1) .* (rand(10,2) - 0.2);
ntestdata = rand(50,2) - offset;%-repmat([.5, .5], 10, 1) .* (rand(10,2) - 0.2);
testdata = [ptestdata; ntestdata];
data = [pdata; ndata];
sampNum = size(data,1);
pSampNum = size(pdata,1);
nSampNum = size(ndata,1);
hold on
for i = 1 : pSampNum
plot(pdata(i,1), pdata(i,2), '.')
end
for i = 1 : nSampNum
plot(ndata(i,1), ndata(i,2), 'r.')
end
classifierNum = 4; % c1 x, c2 y, c3 x, c4 y
xset = sort(data(:,1));
yset = sort(data(:,2));
weight = 1 / sampNum * ones(sampNum, 1);
A = [];
% 训练弱分类器3
for kk = 1
errrate = [];
for i = 1 : length(xset) - 1
txsplit = (xset(i) + xset(i + 1)) / 2;
xdata = data(:,1);
xdata(1:pSampNum) = xdata(1:pSampNum) < txsplit;
xdata(pSampNum+1:end) = xdata(pSampNum+1:end) > txsplit;
errrate = [errrate; xdata' * weight, txsplit];
end
[e, minpos] = min(errrate(:,1));
xsplit2 = errrate(minpos, 2);
a = 0.5 * log(1 / e - 1);
y = data(:,1);
y = y > xsplit2;
y = 2 * (y - 0.5);
t = [ones(pSampNum,1); -1 * ones(nSampNum,1)];
tmp = weight .* exp(-a .* t .* y);
weight = tmp / sum(tmp);
A = [A, a];
e
end
% 训练弱分类器1
for kk = 1
errrate = [];
for i = 1 : length(xset) - 1
txsplit = (xset(i) + xset(i + 1)) / 2;
xdata = data(:,1);
xdata(1:pSampNum) = xdata(1:pSampNum) < txsplit;
xdata(pSampNum+1:end) = xdata(pSampNum+1:end) > txsplit;
errrate = [errrate; xdata' * weight, txsplit];
end
[e, minpos] = min(errrate(:,1));
xsplit = errrate(minpos, 2);
a = 0.5 * log(1 / e - 1);
y = data(:,1);
y = y > xsplit;
y = 2 * (y - 0.5);
t = [ones(pSampNum,1); -1 * ones(nSampNum,1)];
tmp = weight .* exp(-a .* t .* y);
weight = tmp / sum(tmp);
A = [A, a];
e
end
% 训练弱分类器2
for kk = 1
errrate = [];
for i = 1 : length(yset) - 1
tysplit = (yset(i) + yset(i + 1)) / 2;
ydata = data(:,1);
ydata(1:pSampNum) = ydata(1:pSampNum) < tysplit;
ydata(pSampNum+1:end) = ydata(pSampNum+1:end) > tysplit;
errrate = [errrate; ydata' * weight, tysplit];
end
[e, minpos] = min(errrate(:,1));
ysplit = errrate(minpos, 2);
a = 0.5 * log(1 / e - 1);
y = data(:,1);
y = y > ysplit;
y = 2 * (y - 0.5);
t = [ones(pSampNum,1); -1 * ones(nSampNum,1)];
tmp = weight .* exp(-a .* t .* y);
weight = tmp / sum(tmp);
A = [A, a];
e
end
% 训练弱分类器4
for kk = 1
errrate = [];
for i = 1 : length(yset) - 1
tysplit = (yset(i) + yset(i + 1)) / 2;
ydata = data(:,1);
ydata(1:pSampNum) = ydata(1:pSampNum) < tysplit;
ydata(pSampNum+1:end) = ydata(pSampNum+1:end) > tysplit;
errrate = [errrate; ydata' * weight, tysplit];
end
[e, minpos] = min(errrate(:,1));
ysplit2 = errrate(minpos, 2);
a = 0.5 * log(1 / e - 1);
y = data(:,1);
y = y > ysplit2;
y = 2 * (y - 0.5);
t = [ones(pSampNum,1); -1 * ones(nSampNum,1)];
tmp = weight .* exp(-a .* t .* y);
weight = tmp / sum(tmp);
A = [A, a];
e
end
for kk = 1
% draw classifiers
plot(repmat(xsplit, 1, 2), [min(yset), max(yset)])
plot([min(xset), max(xset)], repmat(ysplit, 1, 2), 'r')
plot(repmat(xsplit2, 1, 2), [min(yset), max(yset)], 'linewidth', 2)
plot([min(xset), max(xset)], repmat(ysplit2, 1, 2), 'r', 'linewidth', 2)
% for i = 1 : sampNum
% if 2 * weight(i) > 0.5 * max(weight) + min(weight) || true
% text(data(i,1), data(i,2), [' (', num2str(ceil(-log(weight(i)))), ')'])
% end
% end
% test
y1 = testdata(:,1);
y1 = y1 > xsplit;
y1 = 2 * (y1 - 0.5);
y2 = testdata(:,2);
y2 = y2 > ysplit;
y2 = 2 * (y2 - 0.5);
y3 = testdata(:,1);
y3 = y3 > xsplit2;
y3 = 2 * (y3 - 0.5);
y4 = testdata(:,2);
y4 = y4 > ysplit2;
y4 = 2 * (y4 - 0.5);
Y = [y1, y2, y3, y4];
pre = Y * A' > 0;
for i = 1 : size(testdata, 1)
if i <= size(ptestdata, 1)
plot(testdata(i,1), testdata(i,2), '.')
else
plot(testdata(i,1), testdata(i,2), 'r.')
end
if pre(i) > 0
plot(testdata(i,1), testdata(i,2), 'o')
else
plot(testdata(i,1), testdata(i,2), 'ro')
end
end
end