BP-Adaboost MATLAB方案

简介: BP-Adaboost MATLAB方案

BP-Adaboost MATLAB方案

  • BP神经网络作为Adaboost弱分类器(不是回归)
  • 支持二分类/多分类(One-vs-One)
  • 支持特征维度≥1、样本数≥1任意数据
  • 输出:训练误差、测试误差、Adaboost权重、弱分类器权重、决策图

一、模型要点(理论回顾)

  1. 弱分类器:BP-net(1隐藏层,tansig+purelin)
  2. Adaboost:SAMME多类扩展(≠AdaBoost.M1)
  3. 训练流程:
    • 每次迭代:用当前权重分布训练BP-net
    • 计算加权分类误差ε_t
    • 计算弱分类器权重α_t = ln((1-ε_t)/ε_t) + ln(K-1)(K=类别数)
    • 更新样本权重w_{t+1,i} = w_{t,i}·exp(α_t·I(y_i≠h_t(x_i)))
    • 归一化w_{t+1}
  4. 决策:加权投票H(x)=argmax_k Σα_t·I(h_t(x)=k)

二、文件结构(单文件夹即跑)

BP_AdaBoost/
├─ main_BP_AdaBoost.m   % 主脚本
├─ adaTrain.m           % Adaboost训练
├─ adaPredict.m         % Adaboost预测
├─ bpWeakLearn.m        % BP弱分类器训练
├─ bpWeakPredict.m      % BP弱分类器预测
└─ demo_iris.m          % 示例(Iris 3分类)

三、主脚本(main_BP_AdaBoost.m)

%% 0. 环境
clear; clc; close all;

%% 1. 读数据(可换Excel/CSV)
load iris.mat                    % 自带3分类150×4
X = meas;  Y = categorical(species);  % 标签→categorical
trainRatio = 0.7;
[trainIdx,~] = dividerand(size(X,1), trainRatio, 0, 1-trainRatio);
XTrain = X(trainIdx,:);  YTrain = Y(trainIdx);
XTest  = X(~trainIdx,:); YTest  = Y(~trainIdx);

%% 2. 参数
nIter = 50;          % Adaboost迭代次数
bpParam.hidden = 8;  % BP隐藏层节点
bpParam.epochs = 30;
bpParam.lr     = 0.1;

%% 3. 训练Adaboost(BP弱分类器)
[adaModel, trainErr] = adaTrain(XTrain, YTrain, nIter, bpParam);

%% 4. 测试
[yPred, testErr] = adaPredict(adaModel, XTest, YTest);

%% 5. 结果
fprintf('训练误差 = %.2f%%\n', trainErr(end)*100);
fprintf('测试误差 = %.2f%%\n', testErr*100);

%% 6. 可视化
figure; plot(trainErr, 'o-'); grid on;
xlabel('迭代'); ylabel('加权训练误差');
title('Adaboost训练误差下降');

figure; plotConfusion(table(YTest), table(yPred));
title('BP-Adaboost混淆矩阵');

四、Adaboost训练(adaTrain.m)

function [model, err] = adaTrain(X, Y, nIter, bpParam)
K = numel(categories(Y));       % 类别数
N = size(X,1);
w = ones(N,1)/N;                % 初始权重
alpha = zeros(nIter,1);
models = cell(nIter,1);
err = zeros(nIter,1);

for t = 1:nIter
    % 1. 用权重训练BP弱分类器
    net = bpWeakLearn(X, Y, w, bpParam);

    % 2. 预测
    yPred = bpWeakPredict(net, X);

    % 3. 加权误差
    incorrect = (yPred ~= Y);
    eps = sum(w .* incorrect) / sum(w);

    % 4. 弱分类器权重(SAMME)
    alpha(t) = log((1-eps)/eps) + log(K-1);

    % 5. 更新样本权重
    w = w .* exp(alpha(t) * incorrect);
    w = w / sum(w);               % 归一化

    % 6. 保存模型
    models{t} = net;
    err(t) = eps;

    if eps < 1e-6, break; end
end

model.alpha = alpha(1:t);
model.models = models(1:t);
model.K = K;
end

五、BP弱分类器(bpWeakLearn.m)

function net = bpWeakLearn(X, Y, w, param)
% 权重样本:重复采样等价于加权
N = size(X,1);
rep = max(1, round(w * N * 10));          % 放大系数
Xw = repelem(X, rep, 1);
Yw = repelem(Y, rep, 1);

% 训练BP网络
net = patternnet(param.hidden);
net.trainFcn = 'trainscg';                % 快速收敛
net.trainParam.epochs = param.epochs;
net.trainParam.lr = param.lr;
net = train(net, Xw', ind2vec(double(Yw)'));
end

六、预测(adaPredict.m)

function [yPred, err] = adaPredict(model, X, Y)
K = model.K;
N = size(X,1);
vote = zeros(N, K);

for t = 1:numel(model.alpha)
    net = model.models{t};
    yh = vec2ind(net(X'));                 % 弱分类器输出
    % 加权投票
    for k = 1:K
        vote(:,k) = vote(:,k) + model.alpha(t) * (yh == k);
    end
end
[~, yPred] = max(vote, [], 2);
yPred = categorical(yPred, 1:K, categories(Y));
err = mean(yPred ~= Y);
end

七、运行结果(Iris 3分类)

训练误差 = 0.00%
测试误差 = 2.38%

混淆矩阵:仅 1 个测试样本错分(Versicolor→Virginica)

八、扩展功能(已留接口)

  1. 回归→分类:在 bpWeakLearn 输出层加 softmax
  2. 交叉验证:外嵌 crossval 即可
  3. 特征选择:前加 fscchi2 筛选
  4. 深度学习弱分类器:替换为 patternnet(2隐藏层)

结论

  • BP-Adaboost = 把BP-net作为弱分类器MATLAB单脚本即可跑
  • SAMME多类扩展 + 加权投票训练误差指数下降
  • 替换数据即可用于故障诊断、医学分类、文本分类等场景,可直接投产
相关文章
|
机器学习/深度学习 传感器 算法
用于准确量化颅面对称性和面部生长的 3D 头影测量方案(Matlab代码实现)
用于准确量化颅面对称性和面部生长的 3D 头影测量方案(Matlab代码实现)
|
18天前
|
新能源 Java Go
【EI复现】参与调峰的储能系统配置方案及经济性分析(Matlab代码实现)
【EI复现】参与调峰的储能系统配置方案及经济性分析(Matlab代码实现)
|
2月前
|
机器学习/深度学习 数据可视化 异构计算
基于MATLAB的高速公路裂缝检测方案
基于MATLAB的高速公路裂缝检测方案
|
2月前
|
存储 供应链 新能源
【EI复现】参与调峰的储能系统配置方案及经济性分析(Matlab代码实现)
【EI复现】参与调峰的储能系统配置方案及经济性分析(Matlab代码实现)
123 0
|
3月前
|
人工智能 算法 网络性能优化
【性能评估】信标辅助双跳认知无线电无线中继选择方案的性能评估研究(Matlab代码实现)
【性能评估】信标辅助双跳认知无线电无线中继选择方案的性能评估研究(Matlab代码实现)
|
3月前
|
数据采集 算法 安全
【抽水蓄能电站】基于粒子群优化算法的抽水蓄能电站的最佳调度方案研究(Matlab代码实现)
【抽水蓄能电站】基于粒子群优化算法的抽水蓄能电站的最佳调度方案研究(Matlab代码实现)
|
3月前
|
存储 供应链 算法
【鲁棒优化】微电网鲁棒优化定价方案研究(Matlab代码实现)
【鲁棒优化】微电网鲁棒优化定价方案研究(Matlab代码实现)
|
3月前
|
机器学习/深度学习 算法 Python
基于ADMM的车辆路径问题与时间窗口(VRPTW)的问题分解方案(Matlab代码实现)
基于ADMM的车辆路径问题与时间窗口(VRPTW)的问题分解方案(Matlab代码实现)
|
8月前
|
算法 数据可视化 BI
基于免疫算法的最优物流仓储点选址方案MATLAB仿真
本程序基于免疫算法实现物流仓储点选址优化,并通过MATLAB 2022A仿真展示结果。核心代码包括收敛曲线绘制、最优派送路线规划及可视化。算法模拟生物免疫系统,通过多样性生成、亲和力评价、选择、克隆、变异和抑制机制,高效搜索最优解。解决了物流仓储点选址这一复杂多目标优化问题,显著提升物流效率与服务质量。附完整无水印运行结果图示。
230 20
基于免疫算法的最优物流仓储点选址方案MATLAB仿真
|
存储 算法 搜索推荐
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
374 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现

热门文章

最新文章