Python scipy curve_fit Экспоненциальное уравнение не соответствует ожидаемому - PullRequest
0 голосов
/ 16 марта 2020

У меня есть данные, к которым я пытаюсь вписать экспоненту, эти данные не идеальны, однако при использовании встроенной в JMP функции подбора кривой она работает, как и ожидалось, и я получаю хорошее приближение к моим данным (см. Рисунок ниже, Экспериментальная кривая JMP Fit 3P).

Экспоненциальная кривая JMP Fit Curve 3P

Я знаю, что пытался воспроизвести это с помощью библиотеки python scipy.optimize с помощью функции curve_fit, как описано здесь . Однако это приводит к совершенно другим кривым, см. Ниже.

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

df = pd.read_csv('test.csv', sep = ',' ,index_col = None, engine='python')

def exponential_3p(x, a, b, c):
    return a + b * np.exp(c * x) 

popt, pcov = curve_fit(exponential_3p,df.x,df.y)

a = popt[0] 
b = popt[1]
c = popt[2]

plt.plot(df.x,df.y)
plt.plot(df.x,exponential_3p(df.x, a, b, c))

scipy optimize.curve_fit Exponential

1 Ответ

0 голосов
/ 17 марта 2020

Вы - еще одна жертва непостижимой глупости scipy.optimize.curve_fit.

Кривые и локальные задачи оптимизации ТРЕБУЕТСЯ начальные значения для всех переменных параметров. Они не являются обязательными. Не существует «значения по умолчанию», которое имеет смысл. scipy.optimize.curve_fit лжет вам об этом и позволяет вам не указывать начальные значения и молча (даже не предупреждение!) Предполагает, что вы подразумевали, что все начальные значения равны 1. Это неправильно, неправильно, неправильно.

Вы должны указать разумные начальные значения или подгонку.

...