python - 使用最小二乘法进行指数拟合 Python

标签 python scipy curve-fitting

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

我有两个阵列,一个表示 400 到 750 nm 之间的波长范围,另一个表示吸收光谱。 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 方法中的绝对差进行最小化,以消除重叠的影响?

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

最佳答案

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

您遇到的问题是,您的函数定义只接受一个参数,而它应该接收三个参数:x(计算函数的自变量),加上a_440 S

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

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])

关于python - 使用最小二乘法进行指数拟合 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46812125/

相关文章:

python - 如何终止作为服务运行的 flask 应用程序?

python - 无法估计参数的 Scipy 协方差。为类似的数据工作,为什么不使用这个数据。

python - 如何使用曲线拟合的标准偏差误差来绘制误差条

matlab spectrum 返回比预期更多的 FRAME

r - nls 中的错误 - 迭代次数超过最大值

python unicode渲染: how to know if a unicode character is missing from the font

python - 将 argparse 转义字符作为选项处理

python - 为什么flask找不到这个文件?

python - Numpy:将散点图变成二维数组

python - Scikit 学习 : measure of goodness of fit, 更好地分割数据集还是使用全部数据集?