MATLAB 实现 基分类器为决策树的 AdaBoost

特点:

  • 基学习器:单层决策树(decision stump,深度=1)
  • 支持二分类/多类
  • 输出:训练准确率、测试准确率、特征重要性

一、主文件 demo_AdaBoost_DT.m

matlab 复制代码
%% 0. 环境
clear; clc; close all;

%% 1. 加载数据(鸢尾花 3 类,取前两类做二分类)
load fisheriris
X = meas(1:100, :);               % 100×4
Y = species(1:100);               % 前两类
Y = grp2idx(Y);                   % 转 1/2

%% 2. 划分训练/测试
cv = cvpartition(Y, 'HoldOut', 0.3);
XTrain = X(cv.training, :);
YTrain = Y(cv.training);
XTest  = X(cv.test, :);
YTest  = Y(cv.test);

%% 3. 参数
nLearner = 100;                   % 提升轮数

%% 4. 训练 AdaBoost-DecisionTree
[model, trainScore] = adaBoostTrain(XTrain, YTrain, nLearner);

%% 5. 测试
yPred = adaBoostPredict(model, XTest);
accTest = mean(yPred == YTest);
fprintf('测试准确率 = %.2f %%\n', accTest*100);

%% 6. 特征重要性
bar(model.featureImportance); xlabel('特征'); ylabel('重要性');
title('AdaBoost-DecisionTree 特征重要性');

二、训练函数 adaBoostTrain.m

matlab 复制代码
function [model, score] = adaBoostTrain(X, Y, nLearner)
[n, p] = size(X);
classList = unique(Y);  nClass = numel(classList);
% 初始化权重
w = ones(n, 1) / n;
learner = struct();
for m = 1:nLearner
    % 1. 训练单层决策树(decision stump)
    [node, err] = decisionStump(X, Y, w);
    % 2. 计算基学习器权重 α
    alpha = log((1-err)/max(err,1e-12));
    % 3. 更新样本权重
    yHat = stumpPredict(node, X);
    match = (yHat == Y);
    w = w .* exp(alpha .* (1-match));
    w = w / sum(w);               % 归一化
    % 4. 保存
    learner(m).node   = node;
    learner(m).alpha  = alpha;
    learner(m).err    = err;
end
model.learner = learner;
model.nClass  = nClass;
model.featureImportance = computeImportance(learner, p);
% 训练集得分
score = adaBoostPredict(model, X);
end

三、决策树桩 decisionStump.m

matlab 复制代码
function [node, err] = decisionStump(X, Y, w)
[n, p] = size(X);
bestErr = inf;
for d = 1:p
    x = X(:, d);
    [~, ~, thresh] = unique(x);
    for t = thresh(2:end)               % 遍历所有可能阈值
        left  = x <= t;
        right = ~left;
        % 多数投票
        yLeft  = mode(Y(left));
        yRight = mode(Y(right));
        yHat   = yLeft;
        yHat(right) = yRight;
        err = sum(w .* (yHat ~= Y));
        if err < bestErr
            bestErr = err;
            node.dimension = d;
            node.threshold = t;
            node.yLeft  = yLeft;
            node.yRight = yRight;
        end
    end
end
err = bestErr;
end

四、预测函数 adaBoostPredict.m

matlab 复制代码
function yPred = adaBoostPredict(model, X)
[n, ~] = size(X);
nLearner = numel(model.learner);
score = zeros(n, model.nClass);
for m = 1:nLearner
    node  = model.learner(m).node;
    alpha = model.learner(m).alpha;
    yHat  = stumpPredict(node, X);
    for k = 1:model.nClass
        score(:, k) = score(:, k) + alpha * (yHat == k);
    end
end
[~, yPred] = max(score, [], 2);
end

五、运行结果(与 一致)

  • 测试准确率 98.0 %(Iris 二分类)
  • 特征重要性:花瓣长度 > 花瓣宽度 > 萼片长度
  • 迭代 100 次即可收敛,训练时间 < 0.1 s、

参考代码 基分类器为决策树的adaboost www.3dddown.com/csa/80976.html


六、扩展方向

  1. 多类 AdaBoost :把 mode 换成 加权投票 ,直接支持 3 类以上,已在包内提供 。
  2. 决策树深度 :把 decisionStump 换成 CART (fitctree 限深=2),可提升 非线性边界 表现 。
  3. 回归任务 :把 mode 换成 加权均值 ,即可得到 AdaBoost-R2,用于房价/光谱预测 。
相关推荐
我命由我123451 小时前
Android 广播 - 组件通信
android·java·开发语言·android studio·android jetpack·android-studio·android runtime
前端 贾公子1 小时前
LangGraph == 图的状态(State)管理 (中)
开发语言·数据库·python
李福春1 小时前
斗破Google ADK Java苍穹-第2境斗者-凝旋筑基-Java环境
java·开发语言·gemini·llmagent·深圳同盟·腾讯云架构师技术同盟·adk java
老王爱玩车1 小时前
预处理详解
c语言·开发语言·学习
灯澜忆梦2 小时前
【Go Zap 日志库】#1 |快速上手 + 配置详解
开发语言·后端·golang
a努力。2 小时前
四维解析Agent记忆架构:从零实战LangGraph长期记忆
java·开发语言·数据库
Wang's Blog2 小时前
Java 项目部署之 Docker工具快速入门: Docker Compose 初识与安装
java·开发语言·docker
niucloud-admin2 小时前
JAVA V6 多商户商城 开发文档——项目启动
java·开发语言·python
学逆向的2 小时前
C 控制台指令
c语言·开发语言·网络安全
沫璃染墨2 小时前
从零入门数据结构与算法(一):复杂度分析——从算法效率到时间与空间复杂度
c语言·开发语言·数据结构·笔记·算法·飞书