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

Matlab中fitlm回归模型if语句无法过滤R²=1模型的问题排查

Matlab fitlm模型筛选问题:无法过滤R²=1的模型

问题描述

我在Matlab中使用fitlm函数进行回归分析,希望筛选出普通R²大于0.75但不等于1,且Coefficients中第二个p值小于0.05的模型并绘图(这类模型表现良好但非完美,存在变量自对比情况)。

编写的代码如下:

%do the modelling    
mdl = fitlm(X,comp);

%plot the good models
if mdl.Rsquared.Ordinary > 0.75 && mdl.Rsquared.Ordinary < 1 && mdl.Coefficients.pValue(2) < 0.05

plot(mdl)

end

尝试两种条件写法后遇到异常:

  • 使用mdl.Rsquared.Ordinary ~= 1时,能过滤R²<0.75和p值不满足的模型,但无法过滤R²=1的模型
  • 使用mdl.Rsquared.Ordinary < 1的条件也无效

想知道问题出在哪里?为什么R²>0.75的条件生效,而R²<1或≠1的条件不起作用?


问题根源:浮点数精度误差

Matlab中计算得到的"R²=1"并非严格等于数学意义上的1,而是一个非常接近1的浮点数(比如0.999999999999999或者1.000000000000002)。直接用==/~=/<1这类严格数值对比会因为浮点数的精度偏差失效:

  • 当R²实际是0.999999999999999时,mdl.Rsquared.Ordinary <1会返回true,但如果是1.000000000000001(因计算误差略大于1),<1就会返回false
  • 严格的~=1对比会因为浮点数和1的微小偏差被判定为满足条件,导致R²接近1的模型被错误保留

解决方案:设置容差进行近似对比

不要用严格的数值相等/不等判断,而是设置一个接近1的容差阈值,或者判断R²与1的差值绝对值是否小于某个极小值:

写法1:设置上限阈值

% 设置接近1的上限,比如0.9999,可根据需求调整
if mdl.Rsquared.Ordinary > 0.75 && mdl.Rsquared.Ordinary < 0.9999 && mdl.Coefficients.pValue(2) < 0.05
    plot(mdl)
end

写法2:用差值绝对值判断

% 判断R²与1的差距是否大于极小值(比如1e-10),规避浮点数精度问题
if mdl.Rsquared.Ordinary > 0.75 && abs(mdl.Rsquared.Ordinary - 1) > 1e-10 && mdl.Coefficients.pValue(2) < 0.05
    plot(mdl)
end

补充说明

当回归模型出现完全拟合(比如自变量和因变量完全线性相关,或存在变量自对比)时,Matlab计算的R²可能会因为浮点运算的精度问题,表现为略大于或略小于1的数值,而非严格的1。使用容差对比能有效规避这类精度陷阱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 12:03:24