【问题标题】:Python scipy.curve_fit does not fit log-log plotPython scipy.curve_fit 不适合对数图
【发布时间】:2021-12-01 22:38:24
【问题描述】:

我正在尝试用scipy.curve_fit 拟合一些实验数据,但拟合在对数对数比例图中效果不佳。我认为问题在于算法正确/不正确地加权较小的值。有人可以帮我解决这个问题吗?

这是我的代码:

import numpy as np
from scipy.optimize import curve_fit

def func(Pe_a,a,b):
    return (0.5 * (1 + special.erf(np.log(Pe_a/a)/(2**(0.5)*np.log(b)))))

Pe_a = np.array([1.372322,1.789089,2.315748,5.588003,6.026619,11.165474,24.438136])
si = np.array([5.494556e-04,4.509410e-04,7.419857e-04,2.360942e-02,3.246023e-02,1.213780e-01,5.173072e-01])

popt,pcov = curve_fit(log_norm,Pe_a,si,p0=[np.mean(Pe_a),np.std(Pe_a)],bounds=(1*10**(-10),np.inf))

适合的正确参数应该在a_opt = 24.17b_opt = 2.2 左右,但我得到的是a = 23.813b = 1.955。数据非常适合标准图(小值接近于零),但对于 log-log,对于较小的 Pe_a 值,我得到较大的偏差。这对进一步的计算影响很大。

提前致谢

火焰兵

【问题讨论】:

  • 考虑获取 x 和 y 的对数,在适当调整的模型上执行拟合,并反转变换

标签: python python-3.x scipy curve-fitting


【解决方案1】:

我认为这里的主要问题是您没有足够的数据来限制优化过程。为算法提供数据的不确定性可能是一种前进的方式。例如,看看下面的脚本。通过降低第二高值相对于其他值的权重,SciPy 产生的拟合更接近您的预期。

import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit
from scipy.special import erf


def func(Pe_a, a, b):
    return (1 + erf(np.log(Pe_a / a) / b)) / 2


Pe_a = np.array([1.372322, 1.789089, 2.315748, 5.588003, 6.026619,
                 11.165474, 24.438136])
si = np.array([5.494556e-04, 4.509410e-04, 7.419857e-04, 2.360942e-02,
               3.246023e-02, 1.213780e-01, 5.173072e-01])

x = np.linspace(1, 25, 241)

popt, pcov = curve_fit(func, Pe_a, si)
plt.plot(x, func(x, *popt), label='First fit')

popt, pcov = curve_fit(func, Pe_a, si, sigma=(1, 1, 1, 1, 1, 10, 1))
plt.plot(x, func(x, *popt), label='Second fit')

plt.plot(x, func(x, 24.17, np.sqrt(2) * np.log(2.2)), label='Expected fit')

plt.scatter(Pe_a, si, label='Data')

plt.legend()

plt.gca().set_yscale('log')

plt.show()

【讨论】:

  • 非常感谢!这对我有帮助。但是现在我很难找到给他们权重的“坏点”。这在任何模拟中都不是同一个数据点。
  • 你有什么方法可以估计方差吗?
  • 是的,我可以估计一些统计值,例如方差,但是 Pe_a 的“边界”(低值和高值)将被加权不确定性高......问题是,它会破坏我的进一步计算,因为这个 si 值是最终结果的最小和最大估计之间的插值。这意味着如果在高 Pe_a 和低 Pe_a 处拟合不好,那么使用 si 的插值也不好。
猜你喜欢
  • 1970-01-01
  • 2020-07-23
  • 2018-10-10
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 2021-02-28
相关资源
最近更新 更多