我正在使用来自 SciPy 的 LeastSq 将实验光谱拟合到理论期望值。当然存在与实验值相关的误差。我怎样才能把这些喂给 LeastSq 或者我需要一个不同的例程?我在文档中找不到任何东西。
问问题
3015 次
2 回答
1
scipy.optimize.leastsq函数没有内置的方法来合并权重。但是,scipy.optimize.curve_fit函数确实有一个sigma
参数,可用于指示每个 y 数据点的方差。
curve_fit
用作1.0/sigma
权重,其中sigma
可以是长度数组N
,(与 长度相同ydata
)。
因此,您必须以某种方式根据误差条的大小推测每个 ydata 点的方差,并使用它来确定sigma
.
例如,如果您声明误差条的一半长度代表 1 个标准差,那么方差(curve_fit
称为sigma
)将是标准差的平方。
sigma = (length_of_error_bar/2)**2
参考:
于 2012-10-31T16:47:33.143 回答
0
我自己也在做这件事,所以我将分享我所做的事情,也许我们可以从社区中获得一些意见。我有一组在确定的时间间隔内采集的数据点,我从中计算了标准偏差。我想用 sin 函数来拟合这些点。Leastsq 通过基于一组参数 p 最小化残差或数据点与拟合函数之间的差异来做到这一点。我们可以通过将残差除以方差或标准差的平方来加权残差。
如下:
from scipy.optimize import leastsq
import numpy as np
from matplotlib import pyplot as plt
def sin_func(t, p):
""" Returns the sin function for the parameters:
p[0] := amplitude
p[1] := period/wavelength
p[2] := phase offset
p[3] := amplitude offset
"""
y = p[0]*np.sin(2*np.pi/p[1]*t+p[2])+p[3]
return y
def sin_residuals(p, y, t, std):
err = (y - p[0]*np.sin(2*np.pi/p[1]*t+p[2])-p[3])/std**2
return err
def sin_fit(t, ydata, std, p0):
""" Fits a set of data, ydata, on a domain, t, with individual standard
deviations, std, to a sin curve given the initial parameters, p0, of the form:
p[0] := amplitude
p[1] := period/wavelength
p[2] := phase offset
p[3] := amplitude offset
"""
# optimization #
pbest = leastsq(sin_residuals, p0, args=(ydata, t, std), full_output=1)
p_fit = pbest[0]
# fit to data #
fit = p_fit[0]*np.sin(2*np.pi/p_fit[1]*t+p_fit[2])+p_fit[3]
return p_fit
于 2017-09-25T19:40:29.570 回答