【问题标题】:Python SciPy is 'RuntimeWarning: invalid value encountered in sqrt' bad?Python SciPy 是 \'RuntimeWarning: invalid value encountered in sqrt\' bad?
【发布时间】:2022-11-27 15:01:34
【问题描述】:

我想拟合一些天文数据(主要由数据组成),在一条线上使用高斯函数。我在 x 轴上取了高斯+线函数的残差,所以我只需要拟合高斯。这是我定义它的方式:

def gaussian_only(x, amp,  mean, std):
    curve = amp*np.exp(-(x-mean)**2 /( 2*std**2 ) ) * np.sqrt(std)/np.sqrt(std) * np.sqrt(amp)/np.sqrt(amp) * np.sqrt(mean)/np.sqrt(mean)
    return curve

当曲线拟合(在另一个函数中定义)返回标准差、均值和振幅的负值时,我将这些值乘以并除以平方根。所以这种迫使它只返回正值。 这是功能:

def gaussian_only_fit(arr, curve_residual, initial_guess):
    amp, mean, std = initial_guess
    fit = scipy.optimize.curve_fit(gaussian_only, arr[0], curve_residual, [amp,mean,std])
    return fit

我的所作所为有什么“错误”或“不好”的地方吗?

【问题讨论】:

    标签: python scipy curve-fitting


    【解决方案1】:

    curve_fit() 可能试图用负值 std 评估您的函数。

    您可以使用 curve_fit() 的 bounds 参数来避免这种情况。您可能还应该避免使用 0 标准差进行拟合,因此设置一个非常小的正值作为下限:

    fit = scipy.optimize.curve_fit(gaussian_only, arr[0], curve_residual, [amp,mean,std], bounds=([0, -inf, 1e-15],[inf, inf, inf]))
    

    根据您的应用程序,我还在此处将 amp 的最小值设置为 0。根据数据代表的内容,您可能还想对 mean 设置限制。

    请注意 bounds 参数仅在 scipy 版本 0.17 中引入。如果您使用的是旧版本的 scipy,则可以使用变量转换,例如

    def gaussian_only(x, log_amp,  log_mean, log_std):
        amp = np.exp(log_amp)         # Guarantees 0 < amp < infinity
        mean = np.exp(log_mean)
        std = np.exp(log_std)
        curve = amp*np.exp(-(x-mean)**2 /( 2*std**2 ) )
        return curve
    

    当然,您必须调整您的初始猜测以解释转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      • 2016-12-31
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多