如何有效地使用梯度函数中的目标函数计算进行优化?

时间:2017-04-13 03:55:31

标签: r optimization mathematical-optimization

我正在使用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,以便有效执行目标函数和渐变之间的共享计算?

0 个答案:

没有答案