【问题标题】:Better fitting for a power-law curve更好地拟合幂律曲线
【发布时间】:2020-05-15 13:39:49
【问题描述】:

所以我在数据框中有一些点让我相信我正在处理幂律曲线。经过一番谷歌搜索,我使用我找到的 in this post 进行曲线拟合。

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()

这是结果:

Curve

问题是,曲线拟合导致前几个值的负值(如蓝线所示),而在实际关系中,不存在负 Y 值。

几个问题:

  1. 如何确保不会输出负 Y 值?实际上,0 的 X 也应该具有 0 的 Y 值。
  2. 幂律曲线拟合是否正确?您如何描述这条曲线?

谢谢!

【问题讨论】:

  • 能否请您发布数据链接?
  • 您需要指定参数的界限,在文档docs.scipy.org/doc/scipy/reference/generated/… 中有一个很好的例子,特别是,我认为如果您的债券都在正范围内,您不应该得到任何负值。
  • @Fabrizio 请参阅我对这个问题的回答,其中讨论了强制曲线通过 [0,0] 点的一种方法 - 这也可以防止问题中讨论的负值。跨度>

标签: python scipy statistics regression curve-fitting


【解决方案1】:

如果您只是在寻找一个更适合的简单近似方程,我会从您的图中提取数据并根据您的注释添加已知数据点 [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] 点权重作为我做到了。

【讨论】:

    猜你喜欢
    • 2016-06-24
    • 2015-11-23
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2017-04-27
    相关资源
    最近更新 更多