如何用python绘制符号图中的2西格玛变化
我试图用scipy的曲线拟合函数拟合符号图中的一些样本数据。我的最佳拟合曲线看起来与我下面的代码一致,但我在使用2西格玛曲线时遇到了问题,我想同时显示最佳拟合曲线和灰色填充曲线。我的代码如下所示:如何用python绘制符号图中的2西格玛变化,python,numpy,matplotlib,scipy,curve-fitting,Python,Numpy,Matplotlib,Scipy,Curve Fitting,我试图用scipy的曲线拟合函数拟合符号图中的一些样本数据。我的最佳拟合曲线看起来与我下面的代码一致,但我在使用2西格玛曲线时遇到了问题,我想同时显示最佳拟合曲线和灰色填充曲线。我的代码如下所示: import sys import os import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit import scipy.optimize as optimization M =
import sys
import os
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import scipy.optimize as optimization
M = np.array([-2, -1, 0, 1, 2, 3,4])
Y_z = np.array([0.05, 0.2, 3, 8, 50, 344, 2400 ])
# curve fit linear function
def line(x, a, b):
return a*x+b
popt, pcov = curve_fit(line, M, np.log10(Y_z)) # change here
# plotting
plt.semilogy(M , Y_z, 'o')
plt.semilogy(M, 10**line(M, popt[0], popt[1]), ':', label = 'curve-fit')
# plot 1 sigma -error
y1 = 10**(line(M, popt[0] + pcov[0,0]**0.5, popt[1] - pcov[1,1]**0.5))
y2 = 10**(line(M, popt[0] - pcov[0,0]**0.5, popt[1] + pcov[1,1]**0.5))
plt.semilogy(M, y1, ':')
plt.semilogy(M, y2, ':')
plt.fill_between(M, y1, y2, facecolor="gray", alpha=0.15)
plt.xlabel(r"$\log X$")
plt.ylabel('Y')
plt.legend()
plt.show()
非常感谢您对方差曲线的帮助原则上,线性拟合根本不需要非线性最小二乘曲线拟合:线性回归应该可以工作 也就是说,为了回答您的问题,您可能会发现lmfit()在这里很有用。它有一个稍微高一点的层次和稍微更Pythonic的曲线拟合方法,并添加了许多功能。其中之一是计算所选sigma值结果的不确定性 用lmfit做你的贴合,看起来
import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize as optimization
import lmfit
M = np.array([-2, -1, 0, 1, 2, 3,4])
Y_z = np.array([0.05, 0.2, 3, 8, 50, 344, 2400 ])
# curve fit linear function
def line(x, a, b):
return a*x+b
# set up model and create parameters from model function
# note that function argument names are used for parameters
model = lmfit.Model(line)
params = model.make_params(a=1, b=0)
result = model.fit(np.log10(Y_z), params, x=M)
print(result.fit_report())
它将打印一份关于适合度的报告,如下所示:
[[Model]]
Model(line)
[[Fit Statistics]]
# fitting method = leastsq
# function evals = 8
# data points = 7
# variables = 2
chi-square = 0.10468256
reduced chi-square = 0.02093651
Akaike info crit = -25.4191304
Bayesian info crit = -25.5273101
[[Variables]]
a: 0.77630819 +/- 0.02734470 (3.52%) (init = 1)
b: 0.22311337 +/- 0.06114460 (27.41%) (init = 0)
[[Correlations]] (unreported correlations are < 0.100)
C(a, b) = -0.447
然后使用此结果和拟合结果绘制结果(从表格中稍微修改):
这应该会产生一个像这样的情节
希望有帮助。原则上,线性拟合根本不需要非线性最小二乘曲线拟合:线性回归应该可以工作 也就是说,为了回答您的问题,您可能会发现lmfit()在这里很有用。它有一个稍微高一点的层次和稍微更Pythonic的曲线拟合方法,并添加了许多功能。其中之一是计算所选sigma值结果的不确定性 用lmfit做你的贴合,看起来
import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize as optimization
import lmfit
M = np.array([-2, -1, 0, 1, 2, 3,4])
Y_z = np.array([0.05, 0.2, 3, 8, 50, 344, 2400 ])
# curve fit linear function
def line(x, a, b):
return a*x+b
# set up model and create parameters from model function
# note that function argument names are used for parameters
model = lmfit.Model(line)
params = model.make_params(a=1, b=0)
result = model.fit(np.log10(Y_z), params, x=M)
print(result.fit_report())
它将打印一份关于适合度的报告,如下所示:
[[Model]]
Model(line)
[[Fit Statistics]]
# fitting method = leastsq
# function evals = 8
# data points = 7
# variables = 2
chi-square = 0.10468256
reduced chi-square = 0.02093651
Akaike info crit = -25.4191304
Bayesian info crit = -25.5273101
[[Variables]]
a: 0.77630819 +/- 0.02734470 (3.52%) (init = 1)
b: 0.22311337 +/- 0.06114460 (27.41%) (init = 0)
[[Correlations]] (unreported correlations are < 0.100)
C(a, b) = -0.447
然后使用此结果和拟合结果绘制结果(从表格中稍微修改):
这应该会产生一个像这样的情节
希望这能有所帮助。你的问题是什么?我认为我无法绘制2西格玛方差曲线和最佳拟合曲线。曲线与最佳拟合曲线相交,我不希望您编辑您的问题以包括您的具体问题您的问题是什么?我不认为我可以将2西格玛方差曲线与最佳拟合曲线一起绘制。曲线与最佳拟合相交,我不希望您编辑您的问题以包括您的特定问题,这非常有用,特别是了解lmfit函数。这非常有用,特别是了解lmfit函数。