【问题标题】:automatically stop scipy.optimize.fmin_bfgs after n function calls (not BFGS iterations!)在 n 次函数调用后自动停止 scipy.optimize.fmin_bfgs(不是 BFGS 迭代!)
【发布时间】:2012-05-05 22:32:43
【问题描述】:

我使用逻辑回归和 scipy.optimize.fmin_bfgs 来最小化成本函数。对于我的特定数据集,成本函数保持不变,并且 BFGS 不收敛,所以我想应用 lasso+ridge 正则化。

现在,我想尝试优化正则化参数 lambda1/2 的各种值的成本,以找到最佳组合:

for lambda1 in range(...):
    for lambda2 in range(..):
        scipy.optimize.fmin_bfgs(...) # Optimize cost with lambda1 and lambda2

问题在于,由于 BFGS 没有收敛,它在调用 lambda1/2 的第一个值时“永远”保持不变。

有没有办法在一段时间后自动停止 fmin_bfgs? ma​​xiter 参数对我没有帮助,因为我有 1000 个样本和大量特征/样本,所以它甚至没有在可接受的时间内完成一次这样的迭代。

在 scipy 0.11 中,fmin_bfgs 有一个 ma​​xfun 参数——可以在 scipy 0.10 中以某种方式模拟吗?

编辑:根据大众的需求,这里有一些相关的 sn-ps 代码:

计算成本的函数(通常的符号适用):

def computeCost(theta, X, y):
    h = sigmoid(X.dot(theta.T))
    J = y.T.dot(log(h)) + (1.0 - y.T).dot(log(1.0 - h))
    J_reg2 = theta[1:]**2
    J_reg1 = theta[1:]
    cost = (-1.0 / m) * (J.sum() + LAMBDA2 * J_reg2.sum() + LAMBDA1 * J_reg1.sum())
    return cost

调用 fmin_bfgs 函数:

initial_thetas = numpy.zeros((len(train_X[0]), 1))
myargs = (train_X, train_y)
theta = scipy.optimize.fmin_bfgs(computeCost, x0=initial_thetas, args=myargs)

【问题讨论】:

  • 一种解决方法是向函数本身添加一种调用次数计数器,并在达到所需调用次数时 raise 一个特殊异常。
  • @Zhenya 谢谢!我希望可能有更简单的方法,但我最终可能会这样做。
  • @Denis “delta X”是什么意思?我在 X 中有我的训练样本,没有对它们进行任何修改。
  • 抱歉,theta:打印 theta,查看它们如何移动的成本,或 deltas theta - theta prev,cost - costprev
  • @Denis Aha,好的!好吧,问题是成本变化无穷大(大约小数点后 8 位左右),所以它实际上保持不变。我用我的源代码和输出here on Cross-Validated.SE 做了一个相当广泛的帖子。

标签: python optimization scipy regression


【解决方案1】:

您的问题不在于迭代次数。 lambda 数字没有变化的原因是优化不起作用。 Scipy 应该为您计算出这些数字,而不是您通过 for 循环提供它们。

如果您可以包含更多代码,可能会更容易了解如何修复它。

【讨论】:

  • 但我正在优化 theta 值(成本是 thetas 的函数),而不是 lambdas!我怎样才能从 bfgs 中获得 lambda?
  • 您应该能够将 lambdas 和 thetas 添加为 x0 的一部分,然后在计算成本函数的开头拆分它们
  • 所以我会提交给 BFGS 进行优化,而不是 J(theta), J(theta,lambda)?
猜你喜欢
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 2016-01-20
  • 2020-12-15
  • 1970-01-01
相关资源
最近更新 更多