我正在尝试使用不同的随机值重复求解最佳值。因此最小化函数包含在循环和函数中,然后我调用该函数。但是,它总是给我不同的答案。
import numpy as np
from scipy.optimize import minimize
def Ln(theta): # Every loop tries to minimize this value
error = Y - np.maximum(0, theta[0] + X.dot(theta[1:]))
error_total = np.absolute(error).sum()
return error_total
theta_true = np.array([-6,3,3,3])
Y = np.array(10)
def get_opt_x():
for i in range(10):
X = np.random.standard_normal([10,3]) # generate random values
u = X[:,0]**2*np.random.standard_normal(10)
Y_star = theta_true[0] + X.dot(theta_true[1:]) + u
Y = np.maximum(0, Y_star)
theta0 = np.ones(4)
result = minimize(Ln, theta0, method='BFGS')
print result.x
return
get_opt_x()
这就是它所给出的:
正确的答案应该是不同的,因为对于每个循环,都会生成一组新的随机值。如果我摆脱了这个功能,只需循环一切就可以了:
for i in range(10):
X = np.random.standard_normal([10,3])
u = X[:,0]**2*np.random.standard_normal(10)
Y_star = theta_true[0] + X.dot(theta_true[1:]) + u
Y = np.maximum(0, Y_star)
theta0 = np.ones(4)
result = minimize(Ln, theta0, method='BFGS')
print result.x
在循环和另一个函数中使用最小化函数一定有问题。
答案 0 :(得分:1)
X
中的变量Y
和get_opt_x()
是get_opt_x()
的本地变体,X
和{{1}与不同在函数Y
中。来自Ln
的结果都是相同的,因为它使用了最后一个循环的值(通过删除你的函数)。为了证明在运行第二个块之前尝试关闭会话并运行第一个代码块,您将收到错误消息,指出get_opt_x()
未初始化。
<强>解决方案:强>
将X
和X
作为Y
例程
minimize
答案 1 :(得分:1)
问题是你在函数Y
中定义变量get_opt_x
,然后期望它对Python不允许的函数Ln
可见。删除get_opt_x
函数后,值Y
随后可在全局范围内使用,因此对Ln
函数可见。
你需要告诉Python Y
的{{1}}是一个全局变量:
get_opt_x