Python 使用scipy.optimize.curve\u拟合绘制图形

Python 使用scipy.optimize.curve\u拟合绘制图形,python,matplotlib,scipy,Python,Matplotlib,Scipy,我在理解优化曲线拟合函数时遇到困难。我的拟合函数是幂律。但是我不知道plot命令中的第二个值应该是什么?首先,我们必须调用函数ff(L,v)它将返回拟合线,但我们不调用此函数。我想知道这个命令是如何工作的 x=Ls y=Tc #fitting function def ff(L,v): return L**(-1/v) pfit,perr=optimize.curve_fit(ff,x,y) plt.plot(x,...) plot命令绘制x与y值,因此您必须根据定义的函数ff计算相应

我在理解
优化曲线拟合
函数时遇到困难。我的拟合函数是幂律。但是我不知道plot命令中的第二个值应该是什么?首先,我们必须调用函数
ff(L,v)
它将返回拟合线,但我们不调用此函数。我想知道这个命令是如何工作的

x=Ls
y=Tc
#fitting function
def ff(L,v):
    return L**(-1/v)
pfit,perr=optimize.curve_fit(ff,x,y)
plt.plot(x,...)

plot
命令绘制x与y值,因此您必须根据定义的函数
ff
计算相应的y值。由于
pfit
是作为数组返回的,因此在调用fit函数
ff
时必须解压缩这些值。如果你知道,你有两个系数,你当然可以简单地提取它们,比如
v,k=pfit
,然后用
ff(x,v,k)
计算y值。但是,如果稍后将拟合函数更改为
L**(-1/v)*k+a
,该怎么办?然后你必须重写你的代码。一种更简单的方法是让Python使用
*pfit
解压系数:

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

#define some sample data
x = np.arange(1, 6)
y = np.asarray([100, 37, 18, 3, 1])

#fitting function with more than one parameter to fit
def ff(L, v, k):
    return L**(-1/v) * k

pfit, perr = curve_fit(ff,x,y)
print(pfit)

#plot original data
plt.plot(x, y, "ro", label = "data")
#calculate y-values
y_fit = ff(x, *pfit)
#plot fitted curve
plt.plot(x, y_fit, "b", label = "fit")
plt.legend()
plt.show()
这当然不太令人印象深刻,拟合曲线看起来一点也不平滑:

为了克服这一问题,我们可能希望创建一个分辨率更好的x值范围,并绘制该范围,而不是原始x值数据:

x_fit = np.linspace(np.min(x), np.max(x), 1000)
plt.plot(x_fit, ff(x_fit, *pfit), "b", label = "fit")
现在好多了:


我们是否可以更改比例,使曲线接触y轴,以便我可以轻松读取y轴上的值?我是否可以将此负斜率转换为正斜率?负斜率在原始数据中,而不是在拟合函数本身中。您可以将fit函数中的v符号反转为L**(1/v),但是fit函数只会返回-v。第一个问题与原来的问题相去甚远,如果您不熟悉使用重缩放图形或绘制水平线,您应该问另一个问题。好的,我发布了一个新问题。还有一件事我想知道,在拟合函数中,你提到了另一个不在幂律中的常数。为什么我们要添加这个常数?只是为了便于理解,为什么我们不简单地从pfit中提取v,然后手动将其输入拟合函数。(对于我的随机数据集,拟合函数收敛的问题更少,但这是一个完全不同的问题。)