python - 使用 curve_fit 将曲线拟合为幂律分布不起作用

标签 python numpy scipy runtime-error power-law

我试图找到一条拟合我的数据的曲线,该曲线在视觉上似乎具有幂律分布。

enter image description here

我希望利用 scipy.optimize.curve_fit,但无论我尝试什么函数或数据规范化,我都会得到 RuntimeError(未找到参数或溢出)或远程不适合我的数据的曲线。请帮我弄清楚我在这里做错了什么。

%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

df = pd.DataFrame({
            'x': [ 1000, 3250, 5500, 10000, 32500, 55000, 77500, 100000, 200000 ],
            'y': [ 1100, 500, 288, 200, 113, 67, 52, 44, 5 ]
        })
df.plot(x='x', y='y', kind='line', style='--ro', figsize=(10, 5))

def func_powerlaw(x, m, c, c0):
    return c0 + x**m * c

target_func = func_powerlaw

X = df['x']
y = df['y']

popt, pcov = curve_fit(target_func, X, y)

plt.figure(figsize=(10, 5))
plt.plot(X, target_func(X, *popt), '--')
plt.plot(X, y, 'ro')
plt.legend()
plt.show()

输出
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-243-17421b6b0c14> in <module>()
     18 y = df['y']
     19 
---> 20 popt, pcov = curve_fit(target_func, X, y)
     21 
     22 plt.figure(figsize=(10, 5))

/Users/evgenyp/.virtualenvs/kindle-dev/lib/python2.7/site-packages/scipy/optimize/minpack.pyc in curve_fit(f, xdata, ydata, p0, sigma, absolute_sigma, check_finite, bounds, method, **kwargs)
    653         cost = np.sum(infodict['fvec'] ** 2)
    654         if ier not in [1, 2, 3, 4]:
--> 655             raise RuntimeError("Optimal parameters not found: " + errmsg)
    656     else:
    657         res = least_squares(func, p0, args=args, bounds=bounds, method=method,

RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 800.

最佳答案

作为回溯状态,在没有找到静止点(以终止算法)的情况下达到了函数评估的最大数量。您可以使用选项 maxfev 增加最大数量。 .对于此示例,设置 maxfev=2000足够大以成功终止算法。

然而,解决方案并不令人满意。这是因为算法为变量选择了(默认)初始估计,在本例中,这并不好(需要大量的迭代是一个指标)。提供另一个初始化点(通过简单的反复试验发现)会产生很好的拟合,而无需增加 maxfev .

两个拟合以及与数据的视觉比较如下所示。

x = np.asarray([ 1000, 3250, 5500, 10000, 32500, 55000, 77500, 100000, 200000 ])
y = np.asarray([ 1100, 500, 288, 200, 113, 67, 52, 44, 5 ])

sol1 = curve_fit(func_powerlaw, x, y, maxfev=2000 )
sol2 = curve_fit(func_powerlaw, x, y, p0 = np.asarray([-1,10**5,0]))

enter image description here

关于python - 使用 curve_fit 将曲线拟合为幂律分布不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41109122/

相关文章:

python - 对几个特定频率取 fft 和 ifft

python - 我应该在 Python 中使用 JSON.dumpS 和 .write() 函数还是 json.dump()

使用坐标列表索引二维数组的 Pythonic 方法

Python,余弦相似度与调整后的余弦相似度

Python "here, . . . where"构造

python - 使用 scipy.optimize 拟合多个高斯函数的最 Pythonic 方法

python - 使用 Flask 在 SQLite 中进行事务处理

python - 如何将字符串转换为元组

python - 在python中创建字典的字典

python - 检测 1d 列表值交叉的最简单方法是什么?