Python中的最大似然曲线/模型拟合

机器算法验证 r 最大似然 Python 曲线拟合 逻辑曲线
2022-03-22 17:16:21

我有一些我认为最适合 sigmoid 函数的二维数据。我可以使用以下 python 代码片段进行拟合。

from scipy.optimize import curve_fit
ydata = array([0.1,0.15,0.2,0.3,0.7,0.8,0.9, 0.9, 0.95])
xdata = array(range(0,len(ydata),1))

def sigmoid(x, x0, k):
    y = 1 / (1+ np.exp(-k*(x-x0)))
    return y

popt, pcov = curve_fit(sigmoid, xdata, ydata)

但是,我想使用最大似然方法,以便我可以报告可能性。我认为使用statsmodels包可以做到这一点,但我无法弄清楚。任何帮助,将不胜感激。

更新:

我认为该方法可能是重新定义似然函数,如此处所述:

http://statsmodels.sourceforge.net/devel/examples/generated/example_gmle.html

上述代码片段的绘图如下所示:

在此处输入图像描述

更新 2:

以下是如何在 R 中执行此操作:

require(bbmle)

# this sigmoid function is used to make some fake data
rsigmoid <- function(y1,y2,xi,xmid,w){
   y1+(y2-y1)/(1+exp((xmid-xi)/w))
}
counts <- round(rsigmoid(0, 1, 1:100+rnorm(100,0,3), 50, 10)*20,0)

# NOTE THAT THE SIGMOID FUNCTION IS REDEFINED AS AN R FORMULA
fit_sigmoid <- mle2(P1 ~ dbinom(prob=y1+(y2-y1)/(1+exp((xmid-xi)/w)), size=N), 
             start = list(xmid=50, w=10), 
             data=list(y1=0, y2=1, N=20, P1=counts, xi=1:100),
             method="L-BFGS-B", lower=c(xmid=1,w=1e-5), upper=c(xmid=100,w=100))
1个回答

这是一些伪代码。当然,这取决于您选择的错误结构。您不需要统计模型来执行此操作,因为 Scipy 内置了一个最小化器。最小化器可能不会像 mle2 那样给你 CI。可能还有另一个最小化器可以分析您的参数,但我不知道有一个在我的头顶上。

无论如何,给你

from scipy import stats
import numpy as np
from scipy.optimize import minimize
import pylab as py

ydata = np.array([0.1,0.15,0.2,0.3,0.7,0.8,0.9, 0.9, 0.95])
xdata = np.array(range(0,len(ydata),1))

def sigmoid(params):
    k = params[0]
    x0 = params[1]   
    sd = params[2]

    yPred = 1 / (1+ np.exp(-k*(xdata-x0)))

    # Calculate negative log likelihood
    LL = -np.sum( stats.norm.logpdf(ydata, loc=yPred, scale=sd ) )

    return(LL)


initParams = [1, 1, 1]

results = minimize(sigmoid, initParams, method='Nelder-Mead')
print results.x

estParms = results.x
yOut = yPred = 1 / (1+ np.exp(-estParms[0]*(xdata-estParms[1])))

py.clf()
py.plot(xdata,ydata, 'go')
py.plot(xdata, yOut)
py.show()

这给了我以下信息: MLfit