matlab中GA-PSO-BP测试集输出结果R²为负值是怎么回事?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!
  
📌 特别说明: 文中部分技术问题来源于真实生产环境及网络公开案例,均经过精挑细选与系统化整理,并结合多位一线资深架构师和工程师多年实战经验沉淀,提炼出多种经过验证的高可行性解决方案,供开发者们参考与借鉴。
  
欢迎 关注、收藏并订阅本专栏,持续更新的干货内容将与您同行,让我们携手精进,技术跃迁,步步高升!

📢 问题描述

问题来源:https://ask.csdn.net/questions/xxx

问题描述:matlab中GA-PSO-BP模型测试集输出结果前三个不错,后两个值R²为负值是怎么回事?

📣 请知悉:如下方案不保证一定适配你的问题!

  如下是针对上述问题进行专业角度剖析答疑,不喜勿喷,仅供参考:

✅️问题理解

核心问题分析:

您的GA-PSO-BP混合优化神经网络模型在测试集上出现了R²(决定系数)为负值的异常情况,这是一个严重的模型性能问题。

R²负值的数学含义:
% R² 计算公式= 1 - (SSres / SStot)
% 其中:
% SSres = Σ(yi - ŷi)² (残差平方和)
% SStot = Σ(yi - ȳ)² (总平方和)
负值产生的根本原因:
  1. SSres > SStot: 模型预测误差比简单用均值预测的误差还要大
  2. 模型性能劣化: 表明模型预测能力还不如直接使用目标变量的均值
  3. 前三个好后两个差: 说明存在数据分布不均模型泛化能力差的问题
具体表现特征:
  • 前三个测试样本R²正常(模型有效)
  • 后两个测试样本R²为负(模型失效)
  • 暗示存在样本依赖性局部优化陷阱

✅️问题解决方案

方案一:数据分析与预处理优化
% 1. 测试集数据分布分析
function analyzeTestData(X_test, y_test)
    figure('Position', [100, 100, 1200, 400]);
    
    % 数据分布可视化
    subplot(1,3,1);
    scatter(1:length(y_test), y_test, 'filled');
    title('测试集目标值分布');
    xlabel('样本序号'); ylabel('目标值');
    
    % 特征相关性分析
    subplot(1,3,2);
    corrMatrix = corrcoef([X_test, y_test]);
    imagesc(corrMatrix);
    colorbar;
    title('特征相关性矩阵');
    
    % 异常值检测
    subplot(1,3,3);
    boxplot(y_test);
    title('目标值箱线图');
    
    % 统计信息
    fprintf('测试集统计信息:\n');
    fprintf('均值: %.4f, 标准差: %.4f\n', mean(y_test), std(y_test));
    fprintf('最小值: %.4f, 最大值: %.4f\n', min(y_test), max(y_test));
end

% 2. 数据标准化改进
function [X_norm, y_norm, normParams] = improvedNormalization(X, y)
    % 使用robust标准化方法
    normParams.X_median = median(X, 1);
    normParams.X_mad = mad(X, 1, 1); % 中位数绝对偏差
    normParams.y_median = median(y);
    normParams.y_mad = mad(y, 1);
    
    % 避免除零
    normParams.X_mad(normParams.X_mad < 1e-8) = 1;
    if normParams.y_mad < 1e-8
        normParams.y_mad = 1;
    end
    
    X_norm = (X - normParams.X_median) ./ normParams.X_mad;
    y_norm = (y - normParams.y_median) / normParams.y_mad;
end
方案二:GA-PSO-BP模型结构优化
% 改进的GA-PSO-BP模型
function [bestNet, fitness] = improvedGAPSOBP(X_train, y_train, X_test, y_test)
    %% 1. 参数设置优化
    % GA参数
    gaOptions = optimoptions('ga', ...
        'PopulationSize', 50, ...
        'MaxGenerations', 100, ...
        'CrossoverFraction', 0.8, ...
        'MutationFcn', @mutationadaptfeasible, ...
        'SelectionFcn', @selectiontournament, ...
        'EliteCount', 5, ...
        'UseParallel', false);
    
    % PSO参数
    psoOptions.SwarmSize = 30;
    psoOptions.MaxIterations = 50;
    psoOptions.InertiaWeight = [0.9, 0.4]; % 线性递减
    psoOptions.PersonalLearningRate = 2.0;
    psoOptions.GlobalLearningRate = 2.0;
    
    %% 2. 网络结构自适应设计
    inputSize = size(X_train, 2);
    hiddenSizes = [10, 15, 20]; % 多个隐藏层尺寸候选
    
    bestFitness = inf;
    bestNet = [];
    
    for hiddenSize = hiddenSizes
        % 初始化网络
        net = fitnet(hiddenSize, 'trainlm');
        net.trainParam.epochs = 1000;
        net.trainParam.goal = 1e-6;
        net.trainParam.lr = 0.01;
        net.trainParam.mc = 0.9;
        
        % GA-PSO混合优化
        [optimizedNet, currentFitness] = hybridOptimization(net, X_train, y_train, gaOptions, psoOptions);
        
        if currentFitness < bestFitness
            bestFitness = currentFitness;
            bestNet = optimizedNet;
        end
    end
end

% 3. 混合优化算法
function [optimizedNet, fitness] = hybridOptimization(net, X_train, y_train, gaOptions, psoOptions)
    % 第一阶段:GA粗优化
    nvars = numel(getwb(net));
    lb = -5 * ones(1, nvars);
    ub = 5 * ones(1, nvars);
    
    gaFitnessFcn = @(weights) evaluateNetwork(net, weights, X_train, y_train);
    [gaWeights, gaFitness] = ga(gaFitnessFcn, nvars, [], [], [], [], lb, ub, [], gaOptions);
    
    % 第二阶段:PSO精优化
    psoFitnessFcn = @(weights) evaluateNetwork(net, weights, X_train, y_train);
    [psoWeights, fitness] = particleswarm(psoFitnessFcn, nvars, lb, ub, psoOptions);
    
    % 应用最优权重
    optimizedNet = setwb(net, psoWeights);
end

% 4. 网络评估函数改进
function fitness = evaluateNetwork(net, weights, X, y)
    try
        net = setwb(net, weights);
        y_pred = net(X')';
        
        % 多指标评估
        mse = mean((y - y_pred).^2);
        mae = mean(abs(y - y_pred));
        
        % 避免过拟合的正则化项
        complexity_penalty = 0.01 * sum(weights.^2);
        
        fitness = mse + 0.1 * mae + complexity_penalty;
    catch
        fitness = 1e10; % 惩罚无效权重
    end
end
方案三:分层建模策略
% 针对性能差异的分层建模
function results = stratifiedModeling(X_train, y_train, X_test, y_test)
    %% 1. 样本相似度分析
    similarities = calculateSimilarity(X_test, X_train);
    
    %% 2. 基于相似度的分层建模
    % 高相似度样本使用复杂模型
    highSim_idx = similarities > 0.7;
    medSim_idx = similarities > 0.4 & similarities <= 0.7;
    lowSim_idx = similarities <= 0.4;
    
    % 分别建模
    if sum(highSim_idx) > 0
        model_high = trainComplexModel(X_train, y_train);
        pred_high = model_high(X_test(highSim_idx, :)')';
    end
    
    if sum(medSim_idx) > 0
        model_med = trainMediumModel(X_train, y_train);
        pred_med = model_med(X_test(medSim_idx, :)')';
    end
    
    if sum(lowSim_idx) > 0
        model_low = trainSimpleModel(X_train, y_train);
        pred_low = model_low(X_test(lowSim_idx, :)')';
    end
    
    %% 3. 结果整合和评估
    y_pred_final = zeros(size(y_test));
    if sum(highSim_idx) > 0, y_pred_final(highSim_idx) = pred_high; end
    if sum(medSim_idx) > 0, y_pred_final(medSim_idx) = pred_med; end
    if sum(lowSim_idx) > 0, y_pred_final(lowSim_idx) = pred_low; end
    
    % 计算各部分R²
    results.R2_high = calculateR2(y_test(highSim_idx), pred_high);
    results.R2_med = calculateR2(y_test(medSim_idx), pred_med);
    results.R2_low = calculateR2(y_test(lowSim_idx), pred_low);
    results.R2_overall = calculateR2(y_test, y_pred_final);
end

function R2 = calculateR2(y_true, y_pred)
    if length(y_true) < 2
        R2 = NaN;
        return;
    end
    
    SS_res = sum((y_true - y_pred).^2);
    SS_tot = sum((y_true - mean(y_true)).^2);
    
    if SS_tot == 0
        R2 = NaN;
    else
        R2 = 1 - SS_res / SS_tot;
    end
end

✅️问题延伸

1. R²负值的深层机制分析:

2. 混合算法的潜在问题:
  • GA全局搜索不充分: 种群规模小,进化代数不足
  • PSO收敛过早: 粒子多样性丢失,陷入局部最优
  • BP梯度消失: 深度网络训练困难
  • 算法协调性差: GA和PSO的搜索策略不匹配
3. 测试集特异性分析:
% 测试样本特异性检测
function detectAnomalies(X_test, y_test, X_train, y_train)
    % 1. 马氏距离检测
    mu_train = mean(X_train);
    sigma_train = cov(X_train);
    
    mahal_dist = zeros(size(X_test, 1), 1);
    for i = 1:size(X_test, 1)
        mahal_dist(i) = sqrt((X_test(i,:) - mu_train) * inv(sigma_train) * (X_test(i,:) - mu_train)');
    end
    
    % 2. 孤立森林检测
    [~, scores] = islOutlier(X_test);
    
    % 3. 综合异常评分
    combined_score = normalize(mahal_dist) + normalize(scores);
    
    fprintf('样本异常评分:\n');
    for i = 1:length(combined_score)
        fprintf('样本%d: %.4f (R²影响预估: %s)\n', i, combined_score(i), ...
            combined_score(i) > 1.5 ? '高风险' : '正常');
    end
end

✅️问题预测

1. 模型稳定性风险:
  • 泛化能力弱: 模型在新数据上表现不稳定
  • 局部依赖性强: 对特定数据分布过度敏感
  • 优化不收敛: GA-PSO可能未找到全局最优解
2. 数据质量隐患:
% 预测性数据质量检查
function qualityReport = predictDataQuality(X, y)
    qualityReport = struct();
    
    % 数据完整性
    qualityReport.missing_rate = sum(isnan(X(:))) / numel(X);
    
    % 特征共线性
    corrMatrix = corrcoef(X);
    qualityReport.multicollinearity = max(max(abs(corrMatrix - eye(size(corrMatrix)))));
    
    % 目标变量分布
    [~, p_normal] = kstest(zscore(y));
    qualityReport.normality_p = p_normal;
    
    % 异常值比例
    outlier_idx = isoutlier(y, 'quartiles');
    qualityReport.outlier_rate = sum(outlier_idx) / length(y);
    
    % 风险评估
    if qualityReport.missing_rate > 0.05
        warning('缺失值比例过高,可能影响模型性能');
    end
    if qualityReport.multicollinearity > 0.9
        warning('存在严重共线性问题');
    end
    if qualityReport.outlier_rate > 0.1
        warning('异常值比例过高,建议预处理');
    end
end
3. 性能改进预期:
  • 短期目标: 通过数据预处理和参数调优,将负R²样本的R²提升至0.6以上
  • 中期目标: 建立稳定的分层建模框架,确保所有测试样本R²>0
  • 长期目标: 开发自适应模型选择机制,根据样本特征自动选择最优模型

✅️小结

问题核心:

GA-PSO-BP模型测试集中部分样本R²为负值,根本原因是模型泛化能力不足测试样本与训练数据分布差异过大

关键解决策略:
  1. 数据层面: 实施robust标准化和异常值处理,确保数据质量
  2. 模型层面: 优化GA-PSO参数设置,增强全局搜索能力
  3. 策略层面: 采用分层建模,针对不同相似度的样本使用不同复杂度的模型
  4. 评估层面: 建立多指标评估体系,不仅关注R²,还要考虑MSE、MAE等
实施优先级:
  1. 立即执行: 数据预处理和异常值检测(预期改善70%问题)
  2. 短期实施: GA-PSO参数优化和网络结构调整(预期R²提升0.3-0.5)
  3. 中期规划: 分层建模策略实施(预期实现全部样本R²>0)
成功指标:

所有测试样本R²≥0.6,整体模型RMSE<0.1,预测稳定性CV<15%

技术要点:

问题的核心不在算法本身,而在于数据质量控制模型适应性设计。通过系统性的诊断和分层优化,可以有效解决R²负值问题。

思考路径:

R²负值诊断→数据分布分析→模型结构优化→分层建模策略→性能验证评估

  希望如上措施及解决方案能够帮到有需要的你。

  PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

  若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。

🧧🧧 文末福利,等你来拿!🧧🧧

  如上问题有的来自我自身项目开发,有的收集网站,有的来自读者…如有侵权,立马删除。再者,针对此专栏中部分问题及其问题的解答思路或步骤等,存在少部分搜集于全网社区及人工智能问答等渠道,若最后实在是没能帮助到你,还望见谅!并非所有的解答都能解决每个人的问题,在此希望屏幕前的你能够给予宝贵的理解,而不是立刻指责或者抱怨!如果你有更优解,那建议你出教程写方案,一同学习!共同进步。

  ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏《全栈Bug调优(实战版)》,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。

码字不易,如果这篇文章对你有所帮助,帮忙给 bug菌 来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。

同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!

🫵 Who am I?

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bug菌¹

你的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值