【发布时间】: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? maxiter 参数对我没有帮助,因为我有 1000 个样本和大量特征/样本,所以它甚至没有在可接受的时间内完成一次这样的迭代。
在 scipy 0.11 中,fmin_bfgs 有一个 maxfun 参数——可以在 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