function [tree,discrete_dim] = train_C4_5(S, inc_node, Nu, discrete_dim)
% Classify using Quinlan's C4.5 algorithm
% Inputs:
% training_patterns - Train patterns 训练样本 每一列代表一个样本 每一行代表一个特征
% training_targets - Train targets 1×训练样本个数 每个训练样本对应的判别值
% test_patterns - Test patterns 测试样本,每一列代表一个样本
% inc_node - Percentage of incorrectly assigned samples at a node 一个节点上未正确分配的样本的百分比
% inc_node为防止过拟合,表示样本数小于一定阈值结束递归,可设置为5-10
% 注意inc_node设置太大的话会导致分类准确率下降,太小的话可能会导致过拟合
% Nu is to determine whether the variable is discrete or continuous (the value is always set to 10)
% Nu用于确定变量是离散还是连续(该值始终设置为10)
% 这里用10作为一个阈值,如果某个特征的无重复的特征值的数目比这个阈值还小,就认为这个特征是离散的
% Outputs
% test_targets - Predicted targets 1×测试样本个数 得到每个测试样本对应的判别值
% 也就是输出所有测试样本最终的判别情况
%NOTE: In this implementation it is assumed that a pattern vector with fewer than 10 unique values (the parameter Nu)
%is discrete, and will be treated as such. Other vectors will be treated as continuous
% 在该实现中,假设具有少于10个无重复值的特征向量(参数Nu)是离散的。 其他向量将被视为连续的
train_patterns = S(:,1:end-1)';
train_targets = S(:,end)';
[Ni, M] = size(train_patterns); %M是训练样本数,Ni是训练样本维数,即是特征数目
inc_node = inc_node*M/100; % 5*训练样本数目/100
if isempty(discrete_dim)
%Find which of the input patterns are discrete, and discretisize the corresponding dimension on the test patterns
%查找哪些输入模式(特征)是离散的,并离散测试模式上的相应维
discrete_dim = zeros(1,Ni); %用于记录每一个特征是否是离散特征,初始化都记为0,代表都是连续特征,
%如果后面更改,则意味着是离散特征,这个值会更改为这个离散特征的无重复特征值的数目
for i = 1:Ni %遍历每个特征
Ub = unique(train_patterns(i,:)); %取每个特征的不重复的特征值构成的向量
Nb = length(Ub); %得到无重复的特征值的数目
if (Nb <= Nu) %如果这个特征的无重复的特征值的数目比这个阈值还小,就认为这个特征是离散的
%This is a discrete pattern
discrete_dim(i) = Nb; %得到训练样本中,这个特征的无重复的特征值的数目 存放在discrete_dim(i)中,i表示第i个特征
% dist = abs(ones(Nb ,1)*test_patterns(i,:) - Ub'*ones(1, size(test_patterns,2)));
% %前面是把测试样本中,这个特征的那一行复制成Nb行,Nb是训练样本的这个特征中,无重复的特征值的数目
% %后面是把这几个无重复的特征值构成的向量复制成测试样本个数列
% %求这两个矩阵相应位置差的绝对值
% [m, in] = min(dist); %找到每一列绝对差的最小值,构成m(1×样本数目) 并找到每一列绝对差最小值所在行的位置,构成in(1×样本数目)
% %其实,这个in的中每个值就是代表了每个测试样本的特征值等于无重复的特征值中的哪一个或者更接近于哪一个
% %如=3,就是指这个特征值等于无重复的特征值向量中的第3个或者更接近于无重复的特征值向量中的第3个
% test_patterns(i,:) = Ub(in); %得到这个离散特征
end
end
end
%Build the tree recursively 递归地构造树
% disp('Building tree')
flag = [];
tree = make_tree(train_patterns, train_targets, inc_node, discrete_dim, max(discrete_dim), 0, flag);
function tree = make_tree(patterns, targets, inc_node, discrete_dim, maxNbin, base, flag)
%Build a tree recursively 递归地构造树
[N_all, L] = size(patterns); %%L为当前的样本总数,Ni为特征数目
if isempty(flag)
N_choose = randi([1,N_all],1,0.5*sqrt(N_all));%从所有特征中随机选择m个
Ni_choose = length(N_choose);
flag.N_choose = N_choose;
flag.Ni_choose = Ni_choose;
else
N_choose = flag.N_choose;
Ni_choose = flag.Ni_choose;
end
Uc = unique(targets); %训练样本对应的判别标签 无重复的取得这些标签 也就是得到判别标签的个数
tree.dim = 0; %初始化树的分裂特征为第0个
%tree.child(1:maxNbin) = zeros(1,maxNbin);
tree.split_loc = inf; %初始化分裂位置是inf
if isempty(patterns)
return
end
%When to stop: If the dimension is one or the number of examples is small
% inc_node为防止过拟合,表示样本数小于一定阈值结束递归,可设置为5-10
if ((inc_node > L) | (L == 1) | (length(Uc) == 1)) %如果剩余训练样本太小(小于inc_node),或只剩一个,或只剩一类标签,退出
H = hist(targets, length(Uc)); %统计样本的标签,分别属于每个标签的数目 H(1×标签数目)
[m, largest] = max(H); %得到包含样本数最多的那个标签的索引,记为largest 包含多少个样本,记为m
tree.Nf = [];
tree.split_loc = [];
tree.child = Uc(largest);%姑且直接返回其中包含样本数最多一类作为其标签
return
end
%Compute the node's I
for i = 1:length(Uc) %遍历判别标签的数目
Pnode(i) = length(find(targets == Uc(i))) / L; %得到当前所有样本中 标签=第i个标签 的样本的数目 占样本总数的比例 存放在Pnode(i)中
end
% 计算当前的信息熵(分类期望信息)
% 例如,数据集D包含14个训练样本,9个属于类别“Yes”,5个属于类别“No”,Inode = -9/14 * log2(9/14) - 5/14 * log2(5/14) = 0.940
Inode = -sum(Pnode.*log(Pnode)/log(2));
%For each dimension, compute the gain ratio impurity %对于每维,计算杂质的增益比 对特征集中每个特征分别计算信息熵
%This is done separately for discrete and continuous patterns %对于离散和连续特征,分开计算
delta_Ib = zeros(1, Ni_choose); %Ni是特征维数 用于记录每个特征的信息增益率
split_loc = ones(1, Ni_choose)*inf; %初始化每个特征的分裂值是inf
for i_idx = 1:Ni_choose%遍历每个特征
i = N_choose(i_idx);
data = patterns(i,:); %得到当前所有样本的这个特征的特征值
Ud = unique(data); %得到无重复的特征值构成向量Ud
Nbins = length(Ud); %得到无重复的特征值的数目
if (discrete_dim(i)) %如果这个特征是离散特征
%This is a discrete pattern
P = zeros(length(Uc), Nbins); %Uc是判别标签的个数 判别标签个数×无重复的特征值的数目
for j = 1:length(Uc) %遍历每个标签
for k = 1:Nbins %遍历每个特征值
indices = find((targets == Uc(j)) & (patterns(i,:) == Ud(k)));
% &适用于矩阵间的逻辑运算 &&不适用,只能用于单个元素 &的意思也是与
%找到 (样本标签==第j个标签 并且 当前所有样本的这个特征==第k个特征值) 的样本个数
P(j,k) = length(indices); %记为P(j,k)
end
end
Pk = sum(P); %取P的每一列的和,也就是得到当前所有样本中,这个特征的特征值==这个特征值的样本数目 Pk(1×特征值数目)表示这个特征的特征值等于每个特征值的样本数目
P1 = repmat(Pk, length(Uc), 1); %把Pk复制成 判别标签个数 行
P1 = P1 + eps*(P1==0); %这主要在保证P1作被除数时不等于0
P = P./P1; %得到当前所有样本中,这个特征的值等于每个特征值且标签等于每个标签的样本,占当前这个特征值中的样本的比例
Pk = Pk/sum(Pk); %得到当前所有样本中,这个特征的值等于每个特征值的样本,占当前样本总数的比例
info = sum(-P.*log(eps+P)/log(2)); %对特征集中每个特征分别计算信息熵 info(1×特征值数目)
delta_Ib(i_idx) = (Inode-sum(Pk.*info))/(-sum(Pk.*log(eps+Pk)/log(2))); %计算得到当前特征的信息增益率
%计算信息增益率(GainRatio),公式为Gain(A)/I(A),
%其中Gain(A)=Inode-sum(Pk.*info)就是属性A的信息增益
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
随机森林分类模型是机器学习领域中一种强大的分类算法,以其出色的预测性能和对高维数据的处理能力而受到青睐。该模型通过构建多个决策树并集成它们的预测结果,来提高整体的分类准确性和鲁棒性。 此资源提供了一个完整的Matlab代码实现,允许用户在Matlab环境中快速构建和使用随机森林分类器。代码涵盖了数据导入、预处理、模型训练、分类预测以及性能评估等关键步骤。此外,还包含了一个示例数据集,帮助用户理解如何应用该模型,并提供了详细的使用说明,指导用户如何调整模型参数以适应不同的分类任务。 资源适合机器学习领域的研究人员、数据科学家以及对机器学习算法感兴趣的学生。通过这个资源,用户不仅可以学习到随机森林算法的原理,还可以获得实际编程和应用该算法的经验。此外,该资源还有助于用户理解如何评估和优化分类模型,提高其在数据分析和模式识别项目中的技能。 需要注意的是,虽然随机森林是一个强大的工具,但它并不能保证在所有情况下都能提供完美的分类结果。用户在使用时应考虑数据的特性和分类问题的具体需求,合理选择和调整模型参数。同时,对于模型的使用应遵守相关的法律法规和数据使用协议。
资源推荐
资源详情
资源评论
收起资源包目录
random forest-matlab.zip (5个子文件)
random forest-matlab
train_C4_5.m 13KB
rfmain.m 890B
statistics.m 673B
vote_C4_5.m 2KB
aaa.mat 4.02MB
共 5 条
- 1
资源评论
Layla_c
- 粉丝: 1205
- 资源: 197
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 阿里云OSS Java版SDK.zip
- 阿里云api网关请求签名示例(java实现).zip
- 通过示例学习 Android 的 RxJava.zip
- 通过多线程编程在 Java 中发现并发模式和特性 线程、锁、原子等等 .zip
- 通过在终端中进行探索来学习 JavaScript .zip
- 通过不仅针对初学者而且针对 JavaScript 爱好者(无论他们的专业水平如何)设计的编码挑战,自然而自信地拥抱 JavaScript .zip
- 适用于 Kotlin 和 Java 的现代 JSON 库 .zip
- yolo5实战-yolo资源
- english-chinese-dictionary-数据结构课程设计
- mp-mysql-injector-spring-boot-starter-sql注入
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功