⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcboostmap.m

📁 一个matlab的工具包,里面包括一些分类器 例如 KNN KMEAN SVM NETLAB 等等有很多.
💻 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 + -