2017-10-18 154 views
0

我有一个非常具体的任务,我需要找到我的指数函数的斜率。指数拟合最小二乘法Python

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

我的拟合函数应该是这个样子的是:

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

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

模型化与原作剧情:

enter image description here

我想知道如何定义为了得到它的一个指数拟合(对数变换量)没有我的功能事先猜测S值为

我到目前为止已经试过的目的在于确定这种方式的功能:

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

,它给相当不错的比赛

fitted vs original

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

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

+2

你会显示到目前为止你已经尝试了代码? –

+0

要在python – mikuszefski

+0

@mikuszefski中处理异常值检查[robust fitting](http://scipy-cookbook.readthedocs.io/items/robust_regression.html),非常感谢! – PEBKAC

回答

1

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

你招致的问题是,你定义的函数只接受一个参数时,它应该得到三:x(自变量,其中函数计算),加上a_440S

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

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

这可能是你遇到了关于协方差矩阵的警告。你可以通过参数p0提供一个体面的起点curve_fit并提供一个列表来解决这个问题。例如,在这种情况下p0=[1,0.01]并且在拟合呼叫它看起来像下面

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

谢谢Ignacio,这就是我所做的,它的工作原理! – PEBKAC

+1

@PEBKAC记住你的更新问题,拟合函数缺少指数中的偏移量。我会说这是给你一个更糟的合适。您可以将其添加为拟合参数或将其作为常量。 –

+0

对不起,我粘贴的版本没有偏移量,最后没有使用。谢谢你警告我。最后我用了正确的东西;-)再次感谢! – PEBKAC