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]
我正在尝试使用 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]