与最小二乘法Python

时间:2017-10-18 14:06:40

标签: python scipy curve-fitting

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

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

我的拟合函数看起来应该是这样的:

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

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

模拟与原始情节:

enter image description here

我想知道如何定义我的函数,以便在没有预先猜测的情况下获得指数拟合的日志转换数量) S值是

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

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

它提供了相当不错的比赛

fitted vs original

我不确定这种方法是否正确或我应该采取不同的方式? 如何使用最小二乘法或y方法中的绝对差异来最小化以消除过度效应的影响?

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

1 个答案:

答案 0 :(得分:1)

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

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

清理一下,功能应该更像这样。

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

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

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