循环内的优化函数和另一个函数

时间:2014-05-01 22:48:22

标签: python loops

我正在尝试使用不同的随机值重复求解最佳值。因此最小化函数包含在循环和函数中,然后我调用该函数。但是,它总是给我不同的答案。

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()

这就是它所给出的:

enter image description here

正确的答案应该是不同的,因为对于每个循环,都会生成一组新的随机值。如果我摆脱了这个功能,只需循环一切就可以了:

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

enter image description here

在循环和另一个函数中使用最小化函数一定有问题。

2 个答案:

答案 0 :(得分:1)

X中的变量Yget_opt_x()get_opt_x()的本地变体,X和{{1}与不同在函数Y中。来自Ln的结果都是相同的,因为它使用了最后一个循环的值(通过删除你的函数)。为了证明在运行第二个块之前尝试关闭会话并运行第一个代码块,您将收到错误消息,指出get_opt_x()未初始化。

<强>解决方案:XX作为Y例程

的额外参数传递
minimize

答案 1 :(得分:1)

问题是你在函数Y中定义变量get_opt_x,然后期望它对Python不允许的函数Ln可见。删除get_opt_x函数后,值Y随后可在全局范围内使用,因此对Ln函数可见。

你需要告诉Python Y的{​​{1}}是一个全局变量:

get_opt_x