You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在MatLab中复现Sklearn MLP回归模型遇预测结果不符问题

问题诊断与修正方案

你的复现结果和Sklearn差异巨大,核心问题是漏掉了隐藏层的激活函数,另外还有运算细节需要调整,具体如下:

1. 必须添加隐藏层的激活函数

Sklearn的MLPRegressor默认配置中:

  • 隐藏层的激活函数是relu(修正线性单元),即max(0, x)
  • 输出层回归任务默认是identity(无激活,直接线性输出)

你当前的复现完全没有经过激活函数处理,直接做线性运算,这是结果偏差的核心原因。

2. 权重与偏置的维度验证

确认你从Sklearn提取的参数维度是否正确:

  • my_model.coefs_[0]:输入层到第一层隐藏层的权重,维度是(12, 11),对应你的weight1
  • my_model.coefs_[1]:第一层到第二层隐藏层的权重,维度是(11, 10),对应你的weight2
  • my_model.coefs_[2]:第二层隐藏层到输出层的权重,维度是(10, 1),对应你的weight3
  • my_model.intercepts_[0]:第一层隐藏层的偏置,维度是(11,),在Matlab中要转成(11,1)或(1,11)匹配运算维度
  • my_model.intercepts_[1]:第二层隐藏层的偏置,维度是(10,),同理调整维度
  • my_model.intercepts_[2]:输出层偏置,维度是(1,)

3. 修正后的Matlab复现代码

% 关键:必须使用Sklearn训练集上拟合得到的mean_和scale_进行缩放,而非Matlab默认scale的当前数据统计量
scaled_obs = (raw_obs - train_mean) ./ train_std; 

% 从Sklearn导出的参数,确认维度匹配
w1 = my_model_coefs_0; % 12x11
w2 = my_model_coefs_1; % 11x10
w3 = my_model_coefs_2; % 10x1
b1 = my_model_intercepts_0'; % 转成1x11,匹配矩阵加法维度
b2 = my_model_intercepts_1'; % 转成1x10
b3 = my_model_intercepts_2; % 1x1

% 第一层运算 + relu激活
layer1 = scaled_obs * w1 + b1;
layer1_activated = max(layer1, 0); % relu激活函数

% 第二层运算 + relu激活
layer2 = layer1_activated * w2 + b2;
layer2_activated = max(layer2, 0); % relu激活函数

% 输出层运算(回归任务无激活)
my_prediction = layer2_activated * w3 + b3;

4. 额外验证点

  • 若你的MLPRegressor初始化时指定了其他激活函数(比如tanh),需对应替换Matlab中的激活逻辑
  • 检查矩阵运算的维度匹配:Matlab中矩阵加法要求维度一致,偏置转置要准确,避免广播错误
  • 验证缩放后的数据是否和Sklearn输出完全一致,这是后续运算正确的前提

内容的提问来源于stack exchange,提问作者kh2600

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 14:15:41