Python 2.7 Python:使用scipy.optimize.curve进行数据拟合\u使用sigma=0进行拟合

Python 2.7 Python:使用scipy.optimize.curve进行数据拟合\u使用sigma=0进行拟合,python-2.7,optimization,scipy,curve-fitting,nonlinear-optimization,Python 2.7,Optimization,Scipy,Curve Fitting,Nonlinear Optimization,我正在尝试用scipy.optimize.curve_fit拟合一条曲线,到目前为止效果非常好,除了在我的sigma数组中的值为零的情况下。我知道算法不能处理这个问题,因为在这种情况下我被零除。从scipy文档中: 西格玛:无或M长度序列,可选 如果不是无,则为ydata数组中的不确定性。它们用作最小二乘问题中的权重,即最小化np.和((f(扩展数据,*popt)-ydata)/sigma)**2)如果没有,则假定不确定性为1 我的代码是这样的: import numpy as np impor

我正在尝试用scipy.optimize.curve_fit拟合一条曲线,到目前为止效果非常好,除了在我的sigma数组中的值为零的情况下。我知道算法不能处理这个问题,因为在这种情况下我被零除。从scipy文档中:

西格玛:无或M长度序列,可选 如果不是无,则为ydata数组中的不确定性。它们用作最小二乘问题中的权重,即最小化np.和((f(扩展数据,*popt)-ydata)/sigma)**2)如果没有,则假定不确定性为1

我的代码是这样的:

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

x = [0.125, 0.375, 0.625, 0.875, 1.125, 1.375, 1.625, 1.875, 2.125, 2.375, 2.625, 2.875, 3.125, 3.375, 3.625, 3.875, 4.125, 4.375]
y_para = [0, 0, 0.0414, 0.2164, 0.2616, 0.4254, 0.5698, 0.5921, 0.6286, 0.6452, 0.5879, 0.6032, 0.6667, 0.6325, 0.7629, 0.7164, 0.7091, 0.7887]
err = [0, 0, 0.0391, 0.0331, 0.0943, 0.0631, 0.1219, 0.1063, 0.0912, 0.0516, 0.0365, 0.0327, 0.0227, 0.103, 0.1344, 0.0697, 0.0114, 0.0465]   

def logistic_growth(x, A1, A2, x_0, p):
    return A2 + (A1-A2)/(1+(x/x_0)**p)

x_plot = np.linspace(0, 4.5, 100)

bounds_para = ([0.,0,-np.inf,-np.inf],[0.0000000001, 1,np.inf,np.inf])

paras, paras_cov = curve_fit(logistic_growth, x, y_para, bounds = bounds_para, sigma = err, absolute_sigma=True)
para_curve = logistic_growth(x_plot, *paras)

plt.figure()
plt.errorbar(x,y_para, err, color = 'b', fmt = 'o', label = "Data")
plt.plot(x_plot, para_curve, color = 'b', label = "Fit")    
plt.show()
在不使用curve_fit中的sigma选项的情况下执行此操作可以很好地工作,但包括它会提高:

ValueError: Residuals are not finite in the initial point.
,它由err数组中的零产生。
有人知道解决这个问题的方法吗?

为什么不直接删除这个变量呢?如果它的方差为零,它就无法对您的分析做出任何有意义的贡献

为什么不直接删除变量?如果它的方差为零,它就无法对您的分析做出任何有意义的贡献

这是scipy文件关于曲线拟合σ参数的说法:“这些参数在最小二乘问题中用作权重…”然后,在我看来,它们应该与误差成反比。以下是我的建议

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

x = [0.125, 0.375, 0.625, 0.875, 1.125, 1.375, 1.625, 1.875, 2.125, 2.375, 2.625, 2.875, 3.125, 3.375, 3.625, 3.875, 4.125, 4.375]
y_para = [0, 0, 0.0414, 0.2164, 0.2616, 0.4254, 0.5698, 0.5921, 0.6286, 0.6452, 0.5879, 0.6032, 0.6667, 0.6325, 0.7629, 0.7164, 0.7091, 0.7887]
err = [0, 0, 0.0391, 0.0331, 0.0943, 0.0631, 0.1219, 0.1063, 0.0912, 0.0516, 0.0365, 0.0327, 0.0227, 0.103, 0.1344, 0.0697, 0.0114, 0.0465]   

weights = [1/max(_,0.001) for _ in err]
print (weights)

def logistic_growth(x, A1, A2, x_0, p):
    return A2 + (A1-A2)/(1+(x/x_0)**p)

x_plot = np.linspace(0, 4.5, 100)

bounds_para = ([0.,0,-np.inf,-np.inf],[0.0000000001, 1,np.inf,np.inf])

paras, paras_cov = curve_fit(logistic_growth, x, y_para, bounds = bounds_para, 
    absolute_sigma=True,
    sigma = weights)
para_curve = logistic_growth(x_plot, *paras)

plt.figure()
plt.errorbar(x,y_para, err, color = 'b', fmt = 'o', label = "Data")
plt.plot(x_plot, para_curve, color = 'b', label = "Fit")    
plt.show()
这将导致以下绘图,其中这些初始数据点非常接近拟合线


这是scipy文件关于曲线拟合西格玛参数所说的:“在最小二乘问题中用作权重…”然后,在我看来,它们应该与误差成反比。以下是我的建议

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

x = [0.125, 0.375, 0.625, 0.875, 1.125, 1.375, 1.625, 1.875, 2.125, 2.375, 2.625, 2.875, 3.125, 3.375, 3.625, 3.875, 4.125, 4.375]
y_para = [0, 0, 0.0414, 0.2164, 0.2616, 0.4254, 0.5698, 0.5921, 0.6286, 0.6452, 0.5879, 0.6032, 0.6667, 0.6325, 0.7629, 0.7164, 0.7091, 0.7887]
err = [0, 0, 0.0391, 0.0331, 0.0943, 0.0631, 0.1219, 0.1063, 0.0912, 0.0516, 0.0365, 0.0327, 0.0227, 0.103, 0.1344, 0.0697, 0.0114, 0.0465]   

weights = [1/max(_,0.001) for _ in err]
print (weights)

def logistic_growth(x, A1, A2, x_0, p):
    return A2 + (A1-A2)/(1+(x/x_0)**p)

x_plot = np.linspace(0, 4.5, 100)

bounds_para = ([0.,0,-np.inf,-np.inf],[0.0000000001, 1,np.inf,np.inf])

paras, paras_cov = curve_fit(logistic_growth, x, y_para, bounds = bounds_para, 
    absolute_sigma=True,
    sigma = weights)
para_curve = logistic_growth(x_plot, *paras)

plt.figure()
plt.errorbar(x,y_para, err, color = 'b', fmt = 'o', label = "Data")
plt.plot(x_plot, para_curve, color = 'b', label = "Fit")    
plt.show()
这将导致以下绘图,其中这些初始数据点非常接近拟合线


我认为,在最小化最小二乘问题时,误差是反向使用的。来自scipy doc:“最小二乘问题中的权重,即最小化np.和((f(扩展数据,*popt)-ydata)/sigma)**2)”,这意味着更大的误差/sigma值将导致相应数据点的权重更低。事实上,我以前试过你的建议方法,知道它对这种特殊情况有很好的效果,但我认为这不是解决此类问题的正确方法。我想我的问题是,对于某些数据点,err的零值是否意味着这些点已经被精确地确定,或者它们已经被不精确地确定?误差值越高表示精度越高还是越低?我认为在最小化最小二乘问题时,误差的使用是相反的。来自scipy doc:“最小二乘问题中的权重,即最小化np.和((f(扩展数据,*popt)-ydata)/sigma)**2)”,这意味着更大的误差/sigma值将导致相应数据点的权重更低。事实上,我以前试过你的建议方法,知道它对这种特殊情况有很好的效果,但我认为这不是解决此类问题的正确方法。我想我的问题是,对于某些数据点,err的零值是否意味着这些点已经被精确地确定,或者它们已经被不精确地确定?err值越高,表示精度越高还是越低?这一点很好。也许这是正确解决这个问题的唯一方法。但实际上,我也想考虑这些数据点,因为缺失的错误条是这个数据点的值对于多个复制没有变化的结果。对于非零值也可能发生这种情况,但可能性更大。在这种情况下,为错误设置一个非常低的值也不会起作用,因为它会完全弄乱曲线。我仍然会同意你的建议,因为它给出了很好的结果,在统计上似乎是正确的,并且解决了问题。所以,谢谢你!结果很好。也许这是正确解决这个问题的唯一方法。但实际上,我也想考虑这些数据点,因为缺失的错误条是这个数据点的值对于多个复制没有变化的结果。对于非零值也可能发生这种情况,但可能性更大。在这种情况下,为错误设置一个非常低的值也不会起作用,因为它会完全弄乱曲线。我仍然会同意你的建议,因为它给出了很好的结果,在统计上似乎是正确的,并且解决了问题。所以,谢谢你!