file_data = load('Ionosphere.txt');%%这里是调入一个TXT文件的数据。
ResultR = sign(Classify(RLearners, RWeights, ControlData));
sign Signum function.
For each element of X, sign(X) returns 1 if the element
is greater than zero, 0 if it equals zero and -1 if it is
less than zero. For the nonzero elements of complex X,
sign(X) = X ./ ABS(X).
http://blog.csdn.net/u014114990/article/details/50293495 分类器之Adaboost学习
ErrorR = sum(ControlLabels ~= ResultR) / length(ControlLabels)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
这里,弱分类器作为类使用,而分类器都作为全局函数进行使用。
(1)function [Learners, Weights, {final_hyp}] = RealAdaBoost(WeakLrn, Data, Labels, Max_Iter, {OldW, OldLrn, final_hyp})
说明:Real Adaboot分类算法,以WeakLrn为弱分类器,最大迭代次数:Max_Iter,数据集为Data,Labels
输入:
• WeakLrn – 弱分类器;
• Data – 训练数据集,D*N维矩阵,D表示特征的维数,N表示样本个数;
• Labels – 训练标签,1*N维矩阵,N表示训练样本个数,label取值为:-1或者+1;
• Max_Iter – 迭代次数;
• OldW – 已经建立单元的权重,用于更深层的训练,是可选参数;
• OldLrn – 已经建立单元的learners,用于更深层的训练,是可选参数;
• final_hyp – 已经建立单元的训练数据输出,用于加速更深层的训练,可选参数;
输出:
• Learners – 建立learner的单元阵列,每个learner都代表CART决策树的一个节点,用对象:tree_node_w class来表示;
• Weights – learners的权重. 该矢量与Learners大小相同,并且代表最终单元的每个learner的权重;
• final_hyp – 训练数据的输出。
(2)function [Learners, Weights, {final_hyp}] = GentleAdaBoost(WeakLrn, Data, Labels, Max_Iter, {OldW, OldLrn})
说明:Gentle Adaboot分类算法,以WeakLrn为弱分类器,最大迭代次数:Max_Iter,数据集为Data,Labels,这里的参数与Real Adaboost中一致。
(3)function [Learners, Weights, {final_hyp}] = ModestAdaBoost(WeakLrn, Data, Labels, Max_Iter, {OldW, OldLrn})
说明:Modest Adaboot分类算法,以WeakLrn为弱分类器,最大迭代次数:Max_Iter,数据集为Data,Labels,这里的参数与Real Adaboost中一致。
(4)function Result = Classify(Learners, Weights, Data)
根据各自的权值,使用级联learner将数据分类。结果包含如下数据:
+1或者-1表示类别,幅值表示决策的confidence.
(5)function code = TranslateToC (Learners, Weights, fid)
使用该函数,可将分类器运用到c++中。
TN – 弱分类器的数目;
W – 弱分类器权重;
D – 阈值维数;
T – 阈值的大小;
Ts – 阈值sing. 取值为 –1 或者 +1, 如果样本应该更大或者比阈值小不能分类器正样本时,就重新采样。
x应当是一维行向量,
x'共轭转置后,变成一维列向量,尤其是实数时。
length(x)是求出x的元素个数
ones(length(x),1)是构造一个矩阵,length(x)行1列。
[x' ones(length(x),1)]等效于[x',ones(length(x),1)],即中间加逗号。
也就是将两个列向量并列地放在一起。
最后形成:
[
x1 1
x2 1
x3 1
x4 1
]
一般这样弄,用来直接拟合用的。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
function [Learners, Weights, final_hyp] = RealAdaBoost(WeakLrn, Data, Labels, Max_Iter, OldW, OldLrn, final_hyp)
if( nargin == 4)
Learners = {}; 初始化learner以及权重矩阵
Weights = [];
distr = ones(1, length(Data)) / length(Data);
final_hyp = zeros(1, length(Data));
elseif( nargin > 5)
///
Learners = OldLrn;nargin是用来判断输入变量个数的函数,这样就可以针对不同的情况执行不同的功能。通常可以用他来设定一些默认值,如你上面的函数。
当nargin=5时,options=[10^(-6) 1]
当nargin=4时,evalOps=[];
//
Weights = OldW;
if(nargin < 7)
&&&&&&&&&&&
既然nargin代表输入变量的个数,根据这个输入变量的个数,我们会进入不同的算法阶段。但是这里哪一些是所谓的输入变量,而且是怎么引起权值迭代的?还有待于分析 ,请知道详情的朋友来给解答一下,我也会持续跟进???????????????????
&&&&&&&&&&&&&&&
final_hyp = Classify(Learners, Weights, Data);
end
distr = exp(- (Labels .* final_hyp));
distr = distr / sum(distr);
else
error('Function takes eather 4 or 6 arguments');
end
for It = 1 : Max_Iter
%chose best learner 选择最好的学习分类器
nodes = train(WeakLrn, Data, Labels, distr);
&&&&&&&&&&&&&&&&&
这里面我们有一些函数要详细分析:train(WeakLrn, Data, Labels, distr); calc_output(curr_tr, Data);
&&&&&&&&&&&&&&&&&
for i = 1:length(nodes)
curr_tr = nodes{i};
step_out = calc_output(curr_tr, Data);
s1 = sum( (Labels == 1) .* (step_out) .* distr);
s2 = sum( (Labels == -1) .* (step_out) .* distr);
if(s1 == 0 && s2 == 0)
continue;
end
Alpha = 0.5*log((s1 + eps) / (s2+eps));&&&&&&&&&&&不同的分类器就会有不同的ALPHA的权值迭代值。
Weights(end+1) = Alpha;
Learners{end+1} = curr_tr;
final_hyp = final_hyp + step_out .* Alpha;
end
distr = exp(- 1 * (Labels .* final_hyp));
Z = sum(distr);
distr = distr / Z; 这几行代码是整个算法的核心部分,它实现了权值迭代,通过加权投票得到了强分类器。这里有一些我也没有搞的太明白,希望了解的朋友也帮忙分析一下。
end
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
TrainAndSave.m
file_data = load('Diabetes.txt');这是一个文件装载。但是我找不到'Diabetes.txt这个文件
Data = file_data(:,1:end-1)';把文件FILE_DATA的第一列至倒数第二列给DATA。
Labels = file_data(:, end)';
Labels = Labels*2 - 1;
% Data = Data';
% Labels = Labels';
weak_learner = tree_node_w(2);这里表明弱分类器为分裂层级为2的弱分裂树。
% Step1: training with Gentle AdaBoost
[RLearners RWeights] = RealAdaBoost(weak_learner, Data, Labels, 200);
http://zengkui.blog.163.com/blog/static/21230008220121110111925175/
% Step2: training with Modest AdaBoost
[MLearners MWeights] = ModestAdaBoost(weak_learner, Data, Labels, 200);
http://blog.csdn.net/chenbang110/article/details/11557527
fid = fopen('RealBoost.txt','w');
TranslateToC(RLearners, RWeights, fid);
fclose(fid);
Learners – 建立learner的单元阵列,每个learner都代表CART决策树(http://blog.csdn.net/acdreamers/article/details/44664481)的一个节点,用对象:tree_node_w class来表示;
Weights – learners的权重. 该矢量与Learners大小相同,并且代表最终单元的每个learner的权重;
那么,TranslateToC()会根据弱分类器的LEARNERS 和WEIGHTS 来生成相应的权重值。这里我的解释不一定是对的,各位朋友有好见解可以指出。
fid = fopen('ModestBoost.txt','w');
TranslateToC(MLearners, MWeights, fid);
fclose(fid);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
TranslateToC.m
function code = TranslateToC (Learners, Weights, fid)
Weights = Weights ./ (sum(abs(Weights)));所有WEIGHTS的绝对值之和作为分母。这意为着求权值的均值 。
fprintf(fid, ' %d\r\n ', length(Weights));打印权值向量的长度。
for i = 1 : length(Weights)
Curr_Result = get_dim_and_tr(Learners{i});
% This file is part of GML Matlab Toolbox
% For conditions of distribution and use, see the accompanying License.txt file.
%
% get_dim_and_tr is the function, that returns dimension and threshold of
% tree node
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%
% output = get_dim_and_tr(tree_node, output)
% ---------------------------------------------------------------------------------
% Arguments:
% tree_node - a node of classification tree
% output - vector of dimensions and thresholds. Result fo
% current node would be concatinated to it
% Return:
% output - a vector of thresholds and dimensions. It has the
% following format:
% [dimension threshold left/right ...]
% left/right is [-1, +1] number, wich signifies if
% current threshold is eather left or right
%这个文件是GML MATLAB工具箱的一部分
%的分布及使用条件,见所附license.txt文件。
%
% get_dim_and_tr是函数,返回维度和阈值
为树节点
%
fprintf(fid, ' %f ', Weights(i));
fprintf(fid, ' %d ', length(Curr_Result) / 3);
for j = 1 : length(Curr_Result)
fprintf(fid, ' %f ', Curr_Result(j));
end
fprintf(fid, '\r\n');
end
code = 1;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
function Result = Classify(Learners, Weights, Data)
Result = zeros(1, size(Data, 2));
for i = 1 : length(Weights)
lrn_out = calc_output(Learners{i}, Data);
Result = Result + lrn_out * Weights(i);
end
% This file is part of GML Matlab Toolbox
% For conditions of distribution and use, see the accompanying License.txt file.
%
% calc_output Implements classification of input by a classification tree node
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%
% y = calc_output(tree_node, XData)
% ---------------------------------------------------------------------------------
% Arguments:
% tree_node - classification tree node
% XData - data, that will be classified
% Return:
% y - +1, if XData belongs to tree node, -1 otherwise (y is a vector)
%这个文件是GML MATLAB工具箱的一部分
%的分布及使用条件,见所附license.txt文件。
%
% calc_output通过分类树的节点进行分类输入
% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%
% y = calc_output(tree_node,XDATA)
% ---------------------------------------------------------------------------------
分论点:
% tree_node分类树的节点
% XDATA数据,将分类
回报率%:
% y + 1,如果数据属于树节点,1否则(Y是一个向量)