【问题标题】:Exponential fit with the least squares Python与最小二乘 Python 的指数拟合
【发布时间】:2017-10-18 23:05:41
【问题描述】:

我有一个非常具体的任务,我需要找到我的指数函数的斜率。

我有两个阵列,一个表示 400 到 750 nm 之间的波长范围,另一个表示吸收光谱。 x = 波长,y = 吸收。

我的 fit 函数应该是这样的:

y_mod = np.float(a_440) * np.exp(-S*(x - 440.))

其中S 是斜率,在图像中等于 0.016,它应该在我应该得到的 S 值范围内 (+/- 0.003)。 a_440 为 440 nm 处的参考吸收,x 为波长。

建模与原始图:

我想知道如何定义我的函数,以便得到它的 指数拟合不是对数转换量),而无需事先猜测是什么S 值为

到目前为止我尝试过的是以这种方式定义函数:

def func(x, a, b):
    return a * np.exp(-b * (x-440))

它提供了非常好的匹配

fitted vs original

我不确定这种方法是否正确,还是我应该采取不同的做法? 如何同时使用最小二乘法或 y 方法中的绝对差异来最小化以消除重叠值的影响?

是否也可以在数据中添加随机噪声并重新计算拟合?

【问题讨论】:

  • 你能展示一下你目前尝试过的代码吗?
  • 在python中处理异常值检查robust fitting
  • @mikuszefski,非常感谢!

标签: python scipy curve-fitting


【解决方案1】:

您的情况与documentation for scipy 的curve_fit 中描述的情况相同。

您遇到的问题是,您对函数的定义在应该接收三个参数时只接受一个参数:x(评估函数的自变量),加上a_440S

清理了一下,功能应该是这样的。

def func(x, A, S): 
    return A*np.exp(-S*(x-440.))

您可能会遇到有关协方差矩阵的警告。您可以通过参数p0curve_fit 提供一个不错的起点并提供一个列表来解决这个问题。例如在这种情况下 p0=[1,0.01] 和在合适的调用中它看起来像下面的

curve_fit(func, x, y, p0=[1,0.01])

【讨论】:

  • 谢谢你,Ignacio,这正是我所做的,它有效!
  • @PEBKAC 请记住您更新的问题,拟合函数缺少指数中的偏移量。我会说这让你更不适合。您可以将其添加为拟合参数或将其作为常数。
  • 对不起,我粘贴的版本没有偏移,最后没有使用。谢谢你警告我。最后我使用了正确的东西 ;-) 再次感谢!
猜你喜欢
  • 2020-10-02
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多