计算组合分类器输出中的权重

时间:2013-05-27 07:59:22

标签: classification weighted-average combiners

我有3级分类问题,我有4个分类器。每个分类器返回对每个类的支持。现在我想使用加权平均值和c * L权重(c = 3,L = 4)来组合这些输出,但我不知道如何计算权重?

例如,我有这样的数据集:

D1,1 | 0.85 0.01 0.34 0.44 0.08 0.89 0.01 0.35 0.97 0.04
D1,2 | 0.67 0.03 0.13 0.58 0.06 0.48 0.60 0.59 0.03 0.28
D1,3 | 0.52 0.08 0.50 0.87 0.88 0.01 0.95 0.58 0.83 0.65
D2,1 | 0.29 0.26 0.85 0.46 0.23 0.62 0.09 0.66 0.83 0.48
D2,2 | 0.70 0.02 0.38 0.43 0.86 0.23 0.03 0.64 0.04 0.97
D2,3 | 0.38 0.42 0.69 0.74 0.71 0.52 0.88 0.43 0.54 0.74
D3,1 | 0.56 0.34 0.62 0.46 0.87 0.72 0.24 0.13 0.94 0.56
D3,2 | 0.88 0.54 0.45 0.86 0.93 0.60 0.00 0.75 0.32 0.29
D3,3 | 0.84 0.92 0.47 0.46 0.13 0.58 0.81 0.24 0.80 0.25
D4,1 | 0.89 0.29 0.94 0.49 0.39 0.43 0.14 0.65 0.60 0.88
D4,2 | 0.93 0.33 0.08 0.48 0.98 0.24 0.87 0.85 0.78 0.44
D4,3 | 0.81 0.85 0.27 0.22 0.64 0.42 0.09 0.08 0.79 0.81
TARGET    1    3    1    3    3    1    2    2    2    3

Di,j是对第j类的第i个分类器的支持。 TARGET是真实的观察类。

1 个答案:

答案 0 :(得分:0)

我是这样做的,但我不知道这很好。在我看来它会带来好的结果,因此我认为这很好。有人可以检查一下吗?

%% Prepare environment
clearvars;
close all;
format compact;
clc;

%% Code here
nObservations = 10;
nClasses = 3; % c
nClassifiers = 4; % L

data = [0.85 0.01 0.34 0.44 0.08 0.89 0.01 0.35 0.97 0.04;
    0.67 0.03 0.13 0.58 0.06 0.48 0.60 0.59 0.03 0.28;
    0.52 0.08 0.50 0.87 0.88 0.01 0.95 0.58 0.83 0.65;
    0.29 0.26 0.85 0.46 0.23 0.62 0.09 0.66 0.83 0.48;
    0.70 0.02 0.38 0.43 0.86 0.23 0.03 0.64 0.04 0.97;
    0.38 0.42 0.69 0.74 0.71 0.52 0.88 0.43 0.54 0.74;
    0.56 0.34 0.62 0.46 0.87 0.72 0.24 0.13 0.94 0.56;
    0.88 0.54 0.45 0.86 0.93 0.60 0.00 0.75 0.32 0.29;
    0.84 0.92 0.47 0.46 0.13 0.58 0.81 0.24 0.80 0.25;
    0.89 0.29 0.94 0.49 0.39 0.43 0.14 0.65 0.60 0.88;
    0.93 0.33 0.08 0.48 0.98 0.24 0.87 0.85 0.78 0.44;
    0.81 0.85 0.27 0.22 0.64 0.42 0.09 0.08 0.79 0.81];
data = data';
targets = [1 3 1 3 3 1 2 2 2 3]';

w = zeros(nClassifiers, nClasses);
for iClass = 1:nClasses
    isMemberOfIthClass = zeros(nObservations, 1);
    isMemberOfIthClass(targets == iClass) = 1;
    c = cov(bsxfun(@minus, isMemberOfIthClass, data(:, ((1:nClassifiers)-1)*nClasses+iClass)));
    w(:, iClass) = c \ ones(nClassifiers, 1) / (ones(1, nClassifiers) / c * ones(nClassifiers, 1));
end

mi = zeros(nObservations, nClasses);
for iClass = 1:nClasses
    mi(:, iClass) = data(:, ((1:nClassifiers)-1)*nClasses+iClass)*w(:, iClass);
end

[~, ind] = max(mi, [], 2);
[mi ind targets]