📄 mcboostmap.m
字号:
function [Y_compute, Y_prob] = MCBoostMAP(classifier, para, X_train, Y_train, X_test, Y_test, num_class)
class_set = GetClassSet(Y_train);
p = str2num(char(ParseParameter(para, {'-Iter';'-SampleRatio';'ModeFlag'}, {'5';'0.3';'0'})));
Max_Iter = p(1);
Sample_Ratio = p(2);
ModeFlag = p(3);
%InitWeights = [];
%Gammar = 0.1;
%Comb_Const = 0.1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Data for models
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Y_train = (Y_train == class_set(1)) - (Y_train ~= class_set(1));
% Y_test = (Y_test == class_set(1)) - (Y_test ~= class_set(1));
num_pos = sum(Y_train == 1);
num_neg = sum(Y_train == -1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Initialize the data
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Weights = InitWeights;
Combine_Classifier_Vec = zeros(num_pos + num_neg, 1);
Single_Classifier_Vec = zeros(num_pos + num_neg, 1);
Test_Y_Pred = zeros(length(Y_test), 1);
Test_Y_Combine = zeros(length(Y_test), 1);
pos_idx = find(Y_train == 1);
neg_idx = find(Y_train == -1);
Dist = ones(length(Y_train), 1) ./ length(Y_train);
for iter = 0:Max_Iter
if iter > 0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Compute the sampling distribution
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Pos_Vec = Combine_Classifier_Vec(pos_idx);
Neg_Vec = Combine_Classifier_Vec(neg_idx);
Diff_Mat = 1 ./ (exp(-repmat(Neg_Vec, 1, num_pos) + repmat(Pos_Vec', num_neg, 1)) + 1); % num_neg x num_pos
if mode_flag
Diff_Mat = (Diff_Mat .* Diff_Mat) .* exp(repmat(Pos_Vec', num_neg, 1));
end
% fprintf('Iter %d: Obj_Function = %f\n', iter, sum(sum(log(1 - Diff_Mat)))/num_neg/num_pos);
Pos_Weights = sum(Diff_Mat)';
Neg_Weights = sum(Diff_Mat')';
Dist(pos_idx) = Pos_Weights;
Dist(neg_idx) = Neg_Weights;
Dist = Dist ./ sum(Dist);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Sample data and retrain the model
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if iter > 0
num_samples = ceil(length(Y_train) * Sample_Ratio);
Sample_Idx = unique(SampleDistribution(Dist, num_samples));
X_Sample = X_train(Sample_Idx, :);
Y_Sample = Y_train(Sample_Idx);
else
X_Sample = X_train;
Y_Sample = Y_train;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Compute scores for training data
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[Y_compute Single_Classifier_Vec] = Classify(classifier, para, X_Sample, Y_Sample, X_train, Y_train, num_class);
Weight_Err = sum(Dist .* (Single_Classifier_Vec .* Y_train)) ./ sum(Dist .* abs(Single_Classifier_Vec));
Weight_Err = (1 - Weight_Err) / 2;
if Weight_Err >= 0.5 break, end
Comb_Const = 0.5 * (log(1 - Weight_Err) - log(Weight_Err));
Combine_Classifier_Vec = Combine_Classifier_Vec + Comb_Const .* Single_Classifier_Vec;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Compute the MAP for data
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Train_Err = sum((Combine_Classifier_Vec .* Y_train) <= 0) / length(Y_train);
Train_MAP = ComputeAP(Combine_Classifier_Vec, Y_train, class_set);
[Y_compute Test_Y_Pred] = Classify(classifier, para, X_Sample, Y_Sample, X_test, Y_test, num_class);
Test_Y_Combine = Test_Y_Combine + Test_Y_Pred * Comb_Const;
Test_Err = sum((Test_Y_Combine .* Y_test) <= 0) / length(Y_test);
Test_MAP = ComputeAP(Test_Y_Combine, Y_test, class_set);
fprintf('Iter %d: Train_Err = %f Train_AP = %f\tTest_Err = %f Test_AP = %f\tCombine_Const = %f\n', ...
iter, Train_Err, Train_MAP, Test_Err, Test_MAP, Comb_Const);
end
Y_prob = Test_Y_Combine;
Y_compute = class_set(1) * (Y_prob >= 0) + class_set(2) * (Y_prob < 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -