You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

二次函数拟合数据时R²分数优异但参数不确定性极大的结果解读咨询

二次函数拟合数据时R²分数优异但参数不确定性极大的结果解读咨询

嘿,我来帮你拆解一下这个有点反直觉的拟合结果~

你用自定义的二次函数拟合数据,拿到了0.9698的高R²分数,但参数a、b、y0的不确定性却大得离谱——尤其是b的误差超过了1万,这确实让人困惑。咱们一步步来捋:

核心问题:模型参数的耦合(共线性)

先看你定义的二次函数:

def my_quad(x, a, b, y0):
    return a*(1-x**2/(2*b**2))+ y0

展开后其实是 a - (a/(2*b²))x² + y0,本质上和标准二次函数 Ax² + C 是一回事(这里A = -a/(2b²),C = a + y0)。问题就出在这儿:a和b是耦合在一起的——只要a/(2b²)的结果差不多,换不同的a和b组合,都能得到几乎一模一样的预测值,完美贴合数据(所以R²很高)。但拟合算法没办法精准区分a和b各自的取值,只能给它们一个超大的误差范围,因为太多组合都能满足拟合要求。

为什么R²好但参数误差大?

R²只关心模型预测值和真实数据的贴合程度,不管参数内部怎么“配合”,只要整体趋势对了,R²就会高。但参数不确定性衡量的是“数据能给参数取值多大的约束”——如果多个参数组合都能达到同样的拟合效果,那这些参数的不确定性自然就大了。

从你的代码来看,你给a和b设了下限0,但数据对b的约束可能特别弱:比如你的x数据取值范围很小,x²/(2*b²)这个项的数值变化微乎其微,那b取大一点小一点,对整体预测值几乎没影响,拟合算法自然会给b一个超大的误差范围。

给你几个解决方向

  1. 重新参数化模型,消除耦合
    把耦合的参数合并成一个新参数,比如令 k = a/(2*b²),模型就变成:
def my_quad_simplified(x, k, C):
    return -k * x**2 + C

这里C = a + y0。这样参数之间就没有耦合了,拟合出来的k和C的不确定性会小很多,而且预测效果和原来的模型完全一样——毕竟只是换了一种参数写法。

  1. 检查你的x数据范围
    如果你的x绝对值远小于b的最优解,那x²/(2*b²)这个项几乎可以忽略,模型退化成近似线性的,这时候b的取值根本不影响拟合结果,误差自然大。这种情况下要么收集x取值范围更大的数据,让这个二次项的变化显现出来;要么考虑是不是用线性模型拟合就足够了。

  2. 给参数加更合理的约束(如果有物理意义的话)
    如果a和b有实际的物理含义(比如这个模型看起来像是某种工程或物理领域的拟合?),别只给a和b设下限0,根据你对问题的了解,给b设一个更窄的上下限,比如你知道b大概在100-1000之间,就把bounds改成([0, 100, -np.inf], [np.inf, 1000, np.inf]),这样拟合算法会在合理范围内找最优解,误差会小很多。

  3. 验证参数的相关性
    你可以打印一下pcov的非对角线元素,看看a和b的协方差有多大——如果协方差绝对值很大,就说明这两个参数高度相关,完全验证了咱们说的参数耦合问题。

最后再啰嗦一句:高R²不代表每个参数都能被精准估计,核心还是模型参数和数据的匹配度。调整参数化方式是最直接解决你当前问题的办法~

备注:内容来源于stack exchange,提问作者Emanon

火山引擎 最新活动