scipy.optimize.curve_fit 逻辑函数

scipy.optimize.curve_fit for logistic function

我正在尝试使用 Jupyter Notebook 绘制逻辑函数。我可以很好地绘制它,但使用 scipy.optimize.curve_fit 的逻辑函数不起作用。它returns直线坐标。

如何绘制逻辑回归线?

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

您为逻辑函数选择的方程式不适合您的数据集。它假设您的数据的最小值为零,并且 S 形中点也为零,这两者都不是真实的。

如果您使用 wikipedia 中的方程式并添加偏移量 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()

print(popt)
[  37.07  187.83    0.19 -203.56]