【问题标题】:assigning bounds to individual independent points within the scipy.optimize.curve_fit function为 scipy.optimize.curve_fit 函数中的各个独立点分配边界
【发布时间】:2016-06-21 15:13:44
【问题描述】:

我正在尝试将普朗克曲线拟合到辐射读数。我知道一些已知波长(11 个数据点)的辐射度,要拟合的参数是温度。

从波长和温度返回辐射度的普朗克函数:

def bbody(lam, T) :
    lam = 1e-6 * lam # from micrometres to metres
    return 2*h*c**2 / ( lam**5 * ( np.exp(h*c/(lam*k*T)) - 1 ) ) # radiance in SI units: W.m-2.sr-1.m-1

由 scipy.optimize.curve_fit 使用,输入 11 个波长的辐射度读数:

def fit_planck_curve(wavs_list, rads_list) :
    temp = curve_fit(bbody, wavs_list, rads_list, p0=1800)
    return(temp)

在获取辐射数据并声明它们的波长后调用拟合函数。举个例子:

wavelengths_list = [0.555, 0.659, 0.865, 1.375, 1.61, 2.25, 3.74, 10.85, 12, 3.74, 10.85]
radiances_list = [268900000.00000006, 233200000.00000003, 174400000.0, 200000.0, 49200000.0, 8800000.0, 725170.86180638766, 5713946.0379738025, 5468427.1473144693, 902723.66658727441, 5698079.1655633291]
Temp_estimate = fit_planck_curve(wavelengths_list, radiances_list)[0][0]

到目前为止,这是可行的。

但我想输入更多信息,即波长的界限。 对于进行辐射度读数的 11 个波长中的每一个(自变量),都有界限:

wl_width_array = np.array([0.02, 0.02, 0.02, 0.015, 0.06, 0.05, 0.38, 0.9, 1, 0.38, 0.9])
wl_lowerbound_list = list(np.array(wavelengths_list) - wl_width_array)
wl_upperbound_list = list(np.array(wavelengths_list) + wl_width_array)

这两个列表分别是 11 个波长的上限和下限。

如何让 scipy.optimize.curve_fit 考虑这些界限?有边界选项,但从示例中,我了解到这些是整个自变量的边界,而不是单个点的边界。

我尝试将边界设置为 2 元组,其中第一个元素是两个自变量的下限,第二个元素是上限。每个元素由一个列表(11 个波长的下限或上限)和另一个自变量温度的 np.inf 组成,因此该自变量未设置为边界):

wl_bounds = ([wl_lowerbound_list, -np.inf] , [wl_upperbound_list, np.inf])

但是,我遇到了一个错误。

如何做到这一点? scipy.optimize.curve_fit 有可能吗?还是有其他选择?

谢谢。

【问题讨论】:

    标签: python numpy scipy curve-fitting


    【解决方案1】:

    您的“界限”似乎以某种方式量化了自变量(波长)读数的不确定性。

    bounds 参数绝对没有帮助:它的工作是为您正在估计的参数设置允许的范围(例如,您知道温度不是负数)。

    如果您要处理因变量上的误差线,您可以直接使用least_squaressum_i (y_i - f(x_i))**2 / dy_i**2 形式的成本函数。

    现在,由于您要处理自变量上的误差线,因此仅此一项是行不通的。 将这些考虑在内的一种简单方法可能是假设各个测量值的某种分布(例如,具有由您的边界给出的宽度的高斯分布),生成一堆合成数据集,拟合这些数据集并分析由此产生的温度分布。

    【讨论】:

    • 你好。感谢您的回复。正如我所担心的那样,这比我想象的要复杂。
    猜你喜欢
    • 1970-01-01
    • 2014-08-11
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2018-09-06
    相关资源
    最近更新 更多