Python 更好地拟合幂律曲线
所以我在一个数据框中有一些点让我相信我在处理幂律曲线。在谷歌搜索之后,我用我发现的来进行曲线拟合Python 更好地拟合幂律曲线,python,scipy,statistics,regression,curve-fitting,Python,Scipy,Statistics,Regression,Curve Fitting,所以我在一个数据框中有一些点让我相信我在处理幂律曲线。在谷歌搜索之后,我用我发现的来进行曲线拟合 def func_powerlaw(x, m, c, c0): return c0 + x**m * c target_func = func_powerlaw X = np.array(selection_to_feed.selection[1:]) y = np.array(selection_to_feed.avg_feed_size[1:]) popt, pcov = curv
def func_powerlaw(x, m, c, c0):
return c0 + x**m * c
target_func = func_powerlaw
X = np.array(selection_to_feed.selection[1:])
y = np.array(selection_to_feed.avg_feed_size[1:])
popt, pcov = curve_fit(func_powerlaw, X, y, p0 =np.asarray([-1,10**5,0]))
curvex = np.linspace(0,5000,1000)
curvey = target_func(curvex, *popt)
plt.figure(figsize=(10, 5))
plt.plot(curvex, curvey, '--')
plt.plot(X, y, 'ro')
plt.legend()
plt.show()
结果是:
问题是,曲线拟合会导致前几个值为负值(如蓝线所示),而在实际关系中,不可能存在负Y值
有几个问题:
谢谢大家! 如果你只是在寻找一个更适合的简单近似方程,我从你的图中提取数据,并在你的注释中添加已知数据点[0,0]。由于[0,0]点的不确定度为零——也就是说,你100%确定该值——我使用了加权回归,其中一个已知点的权重非常高,所有其他点的权重为1。这会迫使曲线通过[0,0]点,这可以通过任何允许加权拟合的软件完成。我发现一个标准的几何加偏移方程,“y=a*pow(x,(b*x))+offset”,参数为:
a = -1.0704001788540748E+02
b = -1.5095055897637395E-03
Offset = 1.0704001788540748E+02
如所附绘图所示进行拟合,并通过[0,0]。我的建议是使用实际数据加上已知的[0,0]点,使用这些值作为初始参数估计值,并在可能的情况下使用非常大的权重作为[0,0]点进行回归
如果你只是想寻找一个更适合的简单近似方程,我从你的图中提取了数据,并根据你的注释添加了已知的数据点[0,0]。由于[0,0]点的不确定度为零——也就是说,你100%确定该值——我使用了加权回归,其中一个已知点的权重非常高,所有其他点的权重为1。这会迫使曲线通过[0,0]点,这可以通过任何允许加权拟合的软件完成。我发现一个标准的几何加偏移方程,“y=a*pow(x,(b*x))+offset”,参数为:
a = -1.0704001788540748E+02
b = -1.5095055897637395E-03
Offset = 1.0704001788540748E+02
如所附绘图所示进行拟合,并通过[0,0]。我的建议是使用实际数据加上已知的[0,0]点,使用这些值作为初始参数估计值,并在可能的情况下使用非常大的权重作为[0,0]点进行回归
请您发布一个数据链接好吗?您需要指定参数的界限,文档中有一个很好的例子,我认为如果您的键都在正范围内,您不应该得到任何负值。@Fabrizio请查看我对这个问题的回答,它讨论了迫使曲线通过[0,0]点的方法之一-这也防止了问题中讨论的负值。请发布数据链接好吗?您需要指定参数的边界,文档中有一个很好的例子,我认为如果你的键都在正范围内,你不应该得到任何负值。@Fabrizio请看我对这个问题的回答,其中讨论了迫使曲线通过[0,0]点的方法之一——这也防止了问题中讨论的负值。