scipy.optimize.curve_fit для функции logisti c - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь нарисовать функцию logisti c с помощью Jupyter Notebook. Я могу изобразить это красиво, но функция logisti c с использованием scipy.optimize.curve_fit не работает. Он возвращает координаты прямой линии.

Как построить график регрессии logisti c?

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

df = pd.read_csv('https://gist.githubusercontent.com/shinokada/76070a0927fa1fac01eeaed298757a26/raw/2707a1bd7cba80613a01a2026abeb9f587dbaee5/logisticdata.csv')

x=df.T.iloc[0]
y=df.T.iloc[1]

def logifunc(x,l,c,k):
    return l / (1 + c*np.exp(-k*x))

popt, pcov = curve_fit(logifunc, x, y, p0=[-150,1,1])
print(*popt)

x_data = np.linspace(170,205,num=100)
print(logifunc(x_data, *popt))

plt.scatter(x,y,label='Logistic function')
plt.plot(x_data, logifunc(x_data, *popt), 'r-',label='Fitted function')

plt.title("Logistic")
plt.xlabel('x')
plt.ylabel('y')
plt.xlim(170,210)
plt.ylim(-210,-160)
plt.legend()
plt.show()

enter image description here

1 Ответ

1 голос
/ 13 февраля 2020

Уравнение, которое вы выбрали для функции logisti c, не идеально подходит для вашего набора данных. Предполагается, что минимальное значение для ваших данных равно нулю, а срединная точка сигмоиды также равна нулю, ни одно из которых не является истинным.

Если вы используете уравнение из Википедии и добавляете смещение off, поскольку ваши данные изменяются в диапазоне от -205 до -165:

def logifunc(x,A,x0,k,off):
    return A / (1 + np.exp(-k*(x-x0)))+off

Я переключил l на A, поскольку A теперь представляет разницу между максимальными и минимальными значениями ваших данных ( амплитуда). При разумных стартовых параметрах:

popt, pcov = curve_fit(logifunc, x, y, p0=[50,185,0.1,-222])
plt.scatter(x,y,label='Logistic function')
plt.plot(x_data, logifunc(x_data, *popt), 'r-',label='Fitted function')
plt.legend()

data and fit

print(popt)
[  37.07  187.83    0.19 -203.56]
...