首页 > 解决方案 > 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))

标签: python

解决方案


为什么不增加到maxfev1e6?

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

推荐阅读