我在python中有以下信息(数据帧)
product baskets scaling_factor
12345 475 95.5
12345 108 57.7
12345 2 1.4
12345 38 21.9
12345 320 88.8
我希望运行以下非线性回归并估算参数。
a,b和c
我想要适合的等式:
scaling_factor = a - (b*np.exp(c*baskets))
在sas中我们通常运行以下模型:(使用高斯牛顿法)
proc nlin data=scaling_factors;
parms a=100 b=100 c=-0.09;
model scaling_factor = a - (b * (exp(c*baskets)));
output out=scaling_equation_parms
parms=a b c;
是否有类似的方法使用非线性回归估计Python中的参数,我如何在python中看到该图。
答案 0 :(得分:6)
对于像这样的问题,我总是使用scipy.optimize.minimize
和我自己的最小二乘函数。优化算法不能很好地处理各种输入之间的巨大差异,因此最好在函数中缩放参数,以便暴露给scipy的参数大约为1,因为我是在下面完成。
import numpy as np
baskets = np.array([475, 108, 2, 38, 320])
scaling_factor = np.array([95.5, 57.7, 1.4, 21.9, 88.8])
def lsq(arg):
a = arg[0]*100
b = arg[1]*100
c = arg[2]*0.1
now = a - (b*np.exp(c * baskets)) - scaling_factor
return np.sum(now**2)
guesses = [1, 1, -0.9]
res = scipy.optimize.minimize(lsq, guesses)
print(res.message)
# 'Optimization terminated successfully.'
print(res.x)
# [ 0.97336709 0.98685365 -0.07998282]
print([lsq(guesses), lsq(res.x)])
# [7761.0093358076601, 13.055053196410928]
当然,与所有最小化问题一样,使用良好的初始猜测很重要,因为所有算法都可能陷入局部最小值。可以使用method
关键字更改优化方法;一些可能性是
根据the documentation,默认值为BFGS。
答案 1 :(得分:5)