Вопрос:

Scipy curvefit RuntimeError: Оптимальные параметры не найдены: число вызовов функции достигло maxfev = 1000

python scipy curve-fitting

38299 просмотра

4 ответа

81 Репутация автора

Я хочу придать сумасшедший приступ. Но я продолжаю получать ошибку времени выполнения:

Оптимальные параметры не найдены: количество вызовов функции достигло maxfev = 1000

Я использую следующий скрипт. Может кто-нибудь сказать мне, где я иду не так? Я использую Spyder и я все еще начинающий.

import math
import matplotlib as mpl
from scipy.optimize import curve_fit
import numpy as np

#data
F1=[735.0,696.0,690.0,683.0,680.0,678.0,679.0,675.0,671.0,669.0,668.0,664.0,664.0]
t1=[1,90000.0,178200.0,421200.0,505800.0,592200.0,768600.0,1036800.0,1371600.0,1630800.0,1715400.0,2345400.0,2409012.0]

F1n=np.array(F1)
t1n=np.array(t1)

plt.plot(t1,F1,'ro',label="original data")

# curvefit
def func(t,a,b):
    return a+b*np.log(t)

t=np.linspace(0,3600*24*28,13)

popt, pcov = curve_fit(func, t, F1n, maxfev=1000)    

plt.plot(t, func(t, *popt), label="Fitted Curve")

plt.legend(loc='upper left')
plt.show()
Автор: Tjitze Источник Размещён: 05.04.2013 10:38

Ответы (4)


2 плюса

1328 Репутация автора

После исправления выписок по импорту:

#import matplotlib as mpl
import matplotlib.pyplot as plt

ваш код выдал следующую ошибку:

RuntimeWarning: divide by zero encountered in log

изменения:

#t=np.linspace(0,3600*24*28,13)
t=np.linspace(1,3600*24*28,13)

производится следующий вывод:

введите описание изображения здесь

Автор: StuGrey Размещён: 05.04.2013 11:27

16 плюса

574284 Репутация автора

Ваши исходные данные есть t1и F1. Поэтому curve_fitследует указывать в t1качестве второго аргумента, а не t .

popt, pcov = curve_fit(func, t1, F1, maxfev=1000)

Теперь, как только вы получите подходящие параметры, poptвы можете оценить funcв точках, tчтобы получить подобранную кривую:

t = np.linspace(1, 3600 * 24 * 28, 13)
plt.plot(t, func(t, *popt), label="Fitted Curve")

(Я удалил ноль из t(согласно ответу StuGrey), чтобы избежать Warning: divide by zero encountered in log.)


import matplotlib.pyplot as plt
import scipy.optimize as optimize
import numpy as np

# data
F1 = np.array([
    735.0, 696.0, 690.0, 683.0, 680.0, 678.0, 679.0, 675.0, 671.0, 669.0, 668.0,
    664.0, 664.0])
t1 = np.array([
    1, 90000.0, 178200.0, 421200.0, 505800.0, 592200.0, 768600.0, 1036800.0,
    1371600.0, 1630800.0, 1715400.0, 2345400.0, 2409012.0])

plt.plot(t1, F1, 'ro', label="original data")

# curvefit

def func(t, a, b):
    return a + b * np.log(t)

popt, pcov = optimize.curve_fit(func, t1, F1, maxfev=1000)
t = np.linspace(1, 3600 * 24 * 28, 13)
plt.plot(t, func(t, *popt), label="Fitted Curve")
plt.legend(loc='upper left')
plt.show()

введите описание изображения здесь

Автор: unutbu Размещён: 05.04.2013 12:37

1 плюс

11 Репутация автора

Curve_fit()использует итерации для поиска оптимальных параметров. Если число итераций превышает установленное число 1000, но оптимальные параметры все еще недоступны, то эта ошибка будет повышена. Вы можете указать некоторые начальные параметры угадывания curve_fit(), затем повторите попытку.

Автор: Hanrong Zheng Размещён: 13.01.2019 07:00

0 плюса

3 Репутация автора

SciPy-х

     curve_fit() 

использует итерации для поиска оптимальных параметров. Если число итераций превышает число по умолчанию, равное 800, но оптимальные параметры все еще не найдены, эта ошибка будет вызвана.

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

Вы можете предоставить некоторые начальные параметры предположения для curve_fit (), а затем повторите попытку. Или вы можете увеличить допустимые итерации. Или сделать оба!

Вот пример:

    popt, pcov = curve_fit(exponenial_func, x, y, p0=[1,0,1], maxfev=5000)

р0 это предположение

maxfev - максимальное количество итераций

Вы также можете попробовать установить границы, которые помогут функции найти решение. Однако вы не можете установить границы и max_nfev одновременно.

    popt, pcov = curve_fit(exponenial_func, x, y, p0=[1,0,1], bounds=(1,3))

Источник1: https://github.com/scipy/scipy/issues/6340

Source2: мое собственное тестирование и обнаружение, что about github не на 100% точен

Кроме того, другие рекомендации о неиспользовании 0 в качестве значения 'x' являются отличными Начните свой массив 'x' с 1, чтобы избежать деления на ноль ошибок.

Автор: embulldogs99 Размещён: 13.06.2019 05:05
Вопросы из категории :
32x32