【问题标题】:scipy.optimize.curve_fit for logistic functionscipy.optimize.curve_fit 用于逻辑函数
【发布时间】:2020-02-11 01:36:58
【问题描述】:

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

如何绘制逻辑回归线?

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

【问题讨论】:

    标签: scipy logistic-regression scipy-optimize


    【解决方案1】:

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

    如果您使用 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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多