【问题标题】:Python curve fit optimize using relative deviation instead of absolute deviationPython曲线拟合优化使用相对偏差而不是绝对偏差
【发布时间】:2023-03-31 00:34:01
【问题描述】:

我正在使用scipy.optimize.curve_fit 拟合曲线。据我所知,曲线拟合是通过最小化f(xdata, *popt) - ydata 的残差平方和来执行的,而我想最小化相对误差的平方残差:(f(xdata, *popt) - ydata)/ydata,因为我的ydata 数量级变化很大。如何使用相对偏差进行优化?我不一定需要使用curve_fit 函数。任何实现这一点的python函数都可以。

PS:我知道另一种将ydata 转换为日志空间并拟合结果数据的方法。但我不想这样做。

【问题讨论】:

  • @jezrael 我觉得这更像是一个特定于 python 的编程问题,可能在这里更广泛。
  • 好的,那么不幸的是我不知道应该如何解决它:(

标签: python numpy scipy curve-fitting


【解决方案1】:

估计和上一个问题scipy curve_fit coefficient does not align with expected value (physics relevant?)有关

导入一个由 log(ydata) 组成的新数字文件,而不是导入 ydata。

并将函数 f(xdata) 替换为新函数 log(f(xdata))。

这相当于将拟合标准从LMSE改为LMSRE。

【讨论】:

  • 将数据转换为日志并不等同于进行 LMSRE。它基本上是在拉近数据范围。正如我在问题中所说,我不是在寻找将数据转换为日志空间。我真的想知道这种相对偏差方法是否已经内置到这些函数中。
  • 试试看。
  • 您的建议肯定会改善合身性。但我问的不一样。
  • @SKPS 好吧,这就是日志空间的作用,相对错误。如果您在点xa 的理论值和测量a + sa,则最小二乘的差是( a + sa ) - a = sa。在日志空间中你有log(a + sa) - log( a ) = log( 1 + sa/a )。如果您不喜欢这样,您可以改用least_squares 并使用反向理论值对数据进行加权,如here
  • @mikuszefski:你是对的。用 1/y 加权也是一种等效方法。相关评论 (+1)。
【解决方案2】:

使用逆 y 数据进行误差加权等效于转换为对数空间。这是由于以下原因:在标准最小二乘拟合中,数据y 因错误sa 而偏离“真实”函数值yt。最小二乘拟合最小化所有数据的y - yt = sa 的总和。当进入日志空间时,使用对数的标准规则读取 log(y) - log(yt) = log( yt + sa) - log( yt ) = log( 1 + sa / yt ) = log( y / yt )

因此,JJacquelin 也指出了相对误差。

顺便说一句,作为最小二乘法,当然,这也是( log( y ) - log( yt ) )**2 = ( -log( y ) + log( yt ) )**2 = log( yt / y )**2

【讨论】:

  • 几件事:您还可以添加反权重作为对数空间转换的替代选项。请平衡最后一行的括号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
相关资源
最近更新 更多