使用scipy的拟合幂律最小化

时间:2016-07-25 07:47:56

标签: python optimization scipy power-law

我想使用scipy minimize对形式

的函数进行最大似然估计
y = a * x^b

假设错误通常分布在预测周围。目前,真正的参数根本无法恢复(见下文)。

负对数似然函数:

def loglik(param, data):
    mu = 0.0
    logLikelihood = 0.0
    resid = 0.0
    for i in range(data.shape[0]):
        mu = param[0] * (data[i][0] ** param[1])
        resid = float(data[i][1] - mu) / param[2]
        logLikelihood += -0.5 * resid * resid

    return -(-data.shape[0] * np.log(param[2]) + logLikelihood)

这是我到目前为止使用的代码,但正如您所见,收敛后的参数远非真实的。

def generate(param, x):
    pred = [(param[0] * (x ** param[1])) for x in x]
    return np.array([sum(x) for x in zip(pred, np.random.normal(0, param[2], len(x)))])

生成虚假数据

x = np.linspace(1, 50, num=100)
true_param = [15, 1.1, 5]
data = np.vstack((x, generate(true_param, x))).T

拟合型号

from scipy.optimize import minimize
initParams = [1,1,1]
result = minimize(loglik, method='Nelder-Mead', x0=initParams,args=data)

print(result.x) # should be 15, 1.1, 5

0 个答案:

没有答案