Python R optim vs.Scipy最小化
我正在尝试用Python重新实现以下代码: 然而,我正在努力移植优化(最大化)函数。 我编写了一段代码片段,并制作了两个简单的示例,它们应该会产生相同的结果: R: Python:Python R optim vs.Scipy最小化,python,r,optimization,scipy,Python,R,Optimization,Scipy,我正在尝试用Python重新实现以下代码: 然而,我正在努力移植优化(最大化)函数。 我编写了一段代码片段,并制作了两个简单的示例,它们应该会产生相同的结果: R: Python: omega = np.array([0]) y = np.array([18, 24, 23, 27, 24, 5, 7, 5, 4, 7, 64, 59, 66, 51, 50, 11, 17, 9, 13, 16]) b = np.array([-0.5047485, -0.6346391, -0.375262
omega = np.array([0])
y = np.array([18, 24, 23, 27, 24, 5, 7, 5, 4, 7, 64, 59, 66, 51, 50, 11, 17, 9, 13, 16])
b = np.array([-0.5047485, -0.6346391, -0.375262, -0.4550382, -0.4839501, 0.3181721, 0.4557756, 0.5618271, 0.3847818, 0.485241, -0.4500023, -0.4224367, -0.461969, -0.5605062, -0.4635604, 0.4995454, 0.5027968, 0.5656253, 0.5506545, 0.5368292])
psi = np.array([2.653242, 2.687847, 2.564949, 2.61007, 2.694627, 2.533697, 2.60269, 2.564949, 2.60269, 2.631889, 3.65584, 3.632309, 3.591818, 3.572346, 3.605498, 3.580737, 3.54674, 3.569533, 3.624341, 3.538057])
def llik_alpha_1(y,p,b,psi):
omega = p
lambda_1 = np.exp(psi+b*omega)
return -np.sum(-lambda_1+np.log(lambda_1)*y)
resa = minimize(fun=llik_alpha_1,
args=(omega, b, psi),
x0 = y,
method='BFGS'
)
print(resa)
llik_alpha_1(y, omega, b, psi)
Python的结果:
fun: -1269762128.486976
hess_inv: array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]])
jac: array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0.])
message: 'Optimization terminated successfully.'
nfev: 330
nit: 1
njev: 15
status: 0
success: True
x: array([17066136.98700089, 17288740.69846503, 16498164.49306662,
16788487.73050529, 17332318.02822256, 16297239.29934215,
16740964.51518402, 16498244.64020571, 16740961.51518402,
16928818.13940904, 23515038.90828061, 23363691.01979838,
23103313.65978324, 22978062.91029989, 23191237.49641104,
23032003.83680133, 22813239.86376185, 22959863.68956758,
23312412.21319156, 22757393.14161763])
-1162.2877807382822
正如您所见,这两个优化函数的结果都是-1162.28778073828,但优化器的结果完全不同
- R:-1249.36539272541
- Python:-1269762128.486976
omega = np.array([0])
y = np.array([18, 24, 23, 27, 24, 5, 7, 5, 4, 7, 64, 59, 66, 51, 50, 11, 17, 9, 13, 16])
b = np.array([-0.5047485, -0.6346391, -0.375262, -0.4550382, -0.4839501, 0.3181721, 0.4557756, 0.5618271, 0.3847818, 0.485241, -0.4500023, -0.4224367, -0.461969, -0.5605062, -0.4635604, 0.4995454, 0.5027968, 0.5656253, 0.5506545, 0.5368292])
psi = np.array([2.653242, 2.687847, 2.564949, 2.61007, 2.694627, 2.533697, 2.60269, 2.564949, 2.60269, 2.631889, 3.65584, 3.632309, 3.591818, 3.572346, 3.605498, 3.580737, 3.54674, 3.569533, 3.624341, 3.538057])
def llik_alpha_1(p,y,b,psi):
lambda_1 = np.exp(psi+b*p)
return -np.sum(-lambda_1+np.log(lambda_1)*y)
resa = minimize(fun=llik_alpha_1,
args=(y, b, psi),
x0 = omega,
method='BFGS'
)
print(resa)
llik_alpha_1(omega, y, b, psi)
问题是,我混淆了变量(ω和y)。x0是要优化的参数,在我的例子中是ω而不是y
fun: -1269762128.486976
hess_inv: array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]])
jac: array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0.])
message: 'Optimization terminated successfully.'
nfev: 330
nit: 1
njev: 15
status: 0
success: True
x: array([17066136.98700089, 17288740.69846503, 16498164.49306662,
16788487.73050529, 17332318.02822256, 16297239.29934215,
16740964.51518402, 16498244.64020571, 16740961.51518402,
16928818.13940904, 23515038.90828061, 23363691.01979838,
23103313.65978324, 22978062.91029989, 23191237.49641104,
23032003.83680133, 22813239.86376185, 22959863.68956758,
23312412.21319156, 22757393.14161763])
-1162.2877807382822
omega = np.array([0])
y = np.array([18, 24, 23, 27, 24, 5, 7, 5, 4, 7, 64, 59, 66, 51, 50, 11, 17, 9, 13, 16])
b = np.array([-0.5047485, -0.6346391, -0.375262, -0.4550382, -0.4839501, 0.3181721, 0.4557756, 0.5618271, 0.3847818, 0.485241, -0.4500023, -0.4224367, -0.461969, -0.5605062, -0.4635604, 0.4995454, 0.5027968, 0.5656253, 0.5506545, 0.5368292])
psi = np.array([2.653242, 2.687847, 2.564949, 2.61007, 2.694627, 2.533697, 2.60269, 2.564949, 2.60269, 2.631889, 3.65584, 3.632309, 3.591818, 3.572346, 3.605498, 3.580737, 3.54674, 3.569533, 3.624341, 3.538057])
def llik_alpha_1(p,y,b,psi):
lambda_1 = np.exp(psi+b*p)
return -np.sum(-lambda_1+np.log(lambda_1)*y)
resa = minimize(fun=llik_alpha_1,
args=(y, b, psi),
x0 = omega,
method='BFGS'
)
print(resa)
llik_alpha_1(omega, y, b, psi)