python - Python scipy.optimize 曲线拟合的困难:未找到最佳参数:函数调用次数已达到 maxfev = 1000
问题描述
我希望找到幂律参数是一个容易纠正的问题。使用curve_fit时,我遇到了一个常见的错误,但没有通过建议的解决方案成功规避它。
错误是:
Optimal parameters not found: Number of calls to function has reached maxfev = 1000.
下面是我正在使用的数据和幂律函数。我希望有人可能知道指向我的方向。
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit
def powerlaw(x, amp, ex, x0, y0):
return (amp * np.power((x-x0),ex) + y0)
x = np.array([ 2.5 , 3.51778656, 4.53557312, 4.55335968,
5.57114625, 5.58893281, 5.60671937, 5.62450593,
5.64229249, 8.66007905, 8.67786561, 9.69565217,
9.71343874, 9.7312253 , 10.74901186, 10.76679842,
10.78458498, 11.80237154, 11.8201581 , 11.83794466,
11.85573123, 11.87351779, 12.89130435, 3.5 ,
3.48221344, 4.46442688, 4.44664032, 5.42885375,
5.41106719, 6.39328063, 6.37549407, 6.35770751,
6.33992095, 7.32213439, 8.30434783, 9.28656126,
11.2687747 , 11.25098814, 11.23320158, 11.21541502,
11.19762846, 11.1798419 , 12.16205534, 12.14426877,
12.12648221, 13.10869565])
y = np.array([52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,
69, 70, 71, 72, 73, 74, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74])
print(curve_fit(powerlaw, x, y, maxfev=1000))
解决方案
为什么不增加到maxfev
1e6?
print(curve_fit(powerlaw, x, y, maxfev=1000000))
给出:
(array([ 7.56848833e-80, 3.07781530e+01, -4.06201617e+02, 3.43443918e+01]),
array([[ 7.35597960e-150, -1.37675497e-071, 1.91624708e-070, 4.08767916e-073],
[-1.37675497e-071, 2.57675332e+007, -3.58647084e+008, -7.65034124e+005],
[ 1.91624707e-070, -3.58647083e+008, 4.99188464e+009, 1.06502882e+007],
[ 4.08767868e-073, -7.65034033e+005, 1.06502870e+007, 2.28543208e+004]]))
推荐阅读
- ruby-on-rails - 从rails中的某个id开始删除所有记录?
- java - Http 重定向可以在没有浏览器的情况下工作吗?
- sql - 表达式“column_name”既不存在于 group by 中,也不是聚合函数
- typescript - 如何在反应原生的嵌套堆栈导航中添加标题上的按钮
- acumatica - Acumatica 从菜单中隐藏分支查找
- python - Selenium,熊猫将同一张表写入多个 CSV
- google-chrome-devtools - 在 Chrome 开发者工具中限制控制台输出的数量
- node.js - Node.js POST 请求中的批处理
- ios - 按标题字符串自定义排序部分
- matlab - 配置 Octave 避免自动 endfor、endif 自动完成