1

我使用逻辑回归和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?maxiter参数对没有帮助,因为我有 1000 个样本和大量特征/样本,所以它甚至没有在可接受的时间内完成一次这样的迭代。

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

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

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

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

1 回答 1

1

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

也许如果您可以包含更多代码,则更容易看到如何修复它。

于 2012-04-25T09:56:05.103 回答