Python Scipy optimize curve_fit在拟合自定义函数时为相同参数提供不同的曲线图

Python Scipy optimize curve_fit在拟合自定义函数时为相同参数提供不同的曲线图,python,numpy,matplotlib,curve-fitting,scipy-optimize,Python,Numpy,Matplotlib,Curve Fitting,Scipy Optimize,我在Python中使用scipy.optimize拟合自定义函数时遇到问题,我不知道为什么会发生这种情况。我从中心和标准化二项分布(高斯曲线)生成数据,然后拟合曲线。当我在拟合数据上绘制函数时,预期结果如图所示。但当我试穿时,它失败了 我确信这是一个python式的东西,因为它应该给出参数a=1(这就是我定义它的方式),它给出了参数a=1,但是拟合不好(见图)。但是,如果我在以下方面将西格玛更改为0.65*sigma: p_halfg, p_halfg_cov = optimize.curve_

我在Python中使用scipy.optimize拟合自定义函数时遇到问题,我不知道为什么会发生这种情况。我从中心和标准化二项分布(高斯曲线)生成数据,然后拟合曲线。当我在拟合数据上绘制函数时,预期结果如图所示。但当我试穿时,它失败了

我确信这是一个python式的东西,因为它应该给出参数a=1(这就是我定义它的方式),它给出了参数a=1,但是拟合不好(见图)。但是,如果我在以下方面将西格玛更改为0.65*sigma:

p_halfg, p_halfg_cov = optimize.curve_fit(lambda x, a:piecewise_half_gauss(x, a, sigma = 0.65*sigma_fit), x, y, p0=[1])
,它提供了几乎完美的拟合(如数学预测的,a是5/3)。这些配合应该是相同的,但它们不是! 我在下面给出更多的评论。你能告诉我发生了什么,问题出在哪里吗


我从标准化二项分布生成数据(我可以提供我的代码,但现在值更重要)。这是一个N=10,p=0.5的分布,我把它居中,只取曲线的右边。然后我用我的半高斯函数拟合它,如果它的参数a=1(sigma等于分布的sigma,sqrt(np(1-p)),它应该是与二项式相同的分布。现在的问题是,尽管获得了参数a的正确值,但它不符合图中所示的数据

注意奇怪的东西。。。如果我设置sigma=3*sigma_拟合,我得到a=1/3和一个非常差的拟合(低估)。如果我将它设置为0.2*sigma_拟合,我也会得到一个不好的拟合,a=1/0.2=5(高估)。等等为什么?(顺便说一句,a=1/sigma,因此装配程序应该有效)

编辑--已解决: 这是一个绘图问题,需要使用

y_fit = piecewise_half_gauss(f_fit, a, sigma = 0.6*sigma_fit)

问题在于绘制和拟合参数——如果我用不同的
sigma
进行拟合,我还需要在生成
y\u-fit
时在绘图部分对其进行更改:

#获取拟合参数
p_halfg,p_halfg_cov=优化曲线拟合(λx,a:分段半高斯(x,a,sigma=0.6*sigma_拟合),x,y,p0=[1])
...
y_拟合=分段半高斯(f_拟合,a,σ=0.6*sigma_拟合)
plt.scatter(x, y, c = 'r', label = 'Original points')
plt.plot(np.linspace(0,5,50), piecewise_half_gauss(np.linspace(0,5,50), 1, sigma_fit), label = 'Fit')
plt.legend()
y_fit = piecewise_half_gauss(f_fit, a, sigma = 0.6*sigma_fit)