我正在使用here中的示例,其中原始帖子的目标函数返回一个列表,第一个元素等于目标函数的值,第二个元素是渐变:
logisticRegressionCost <- function(theta, X, y) {
J = 0;
theta = as.matrix(theta);
X = as.matrix(X);
y = as.matrix(y);
rows = dim(theta)[2];
cols = dim(theta)[1];
grad = matrix(0, rows, cols);
predicted = sigmoid(X %*% theta);
J = (-y) * log(predicted) - (1 - y) * log(1 - predicted);
J = sum(J) / dim(y)[1];
grad = t(predicted - y);
grad = grad %*% X;
grad = grad / dim(y)[1];
return(list(fn = J, gr = t(grad)));
}
使用optim
的建议解决方案是将其拆分为两个独立的函数,用作包装器,例如:
fn <- function(...){
logisticRegressionCost(...)$fn
}
gr <- function(...){
logisticRegressionCost(...)$gr
}
因此可以像optim
一样调用optim(fn = fn, gr = gr, ...)
。
然而,这是不能令人满意的,因为梯度的计算通常依赖于与目标函数的共享计算。在这种情况下,行:
predicted = sigmoid(X %*% theta);
肯定会重复。
有没有办法使用optim
,以便有效执行目标函数和渐变之间的共享计算?