如何为nlm提供渐变(或粗麻布)?

时间:2017-02-27 22:45:28

标签: r mathematical-optimization model-fitting

在非线性最小化函数stats::nlm的帮助文件中,它声明其中一个参数f是(强调我的):

  

要最小化的函数,返回单个数值。这应该是一个函数,第一个参数是长度为p的向量,后跟由...参数指定的任何其他参数。   如果函数值具有名为gradient或梯度和粗体属性的属性,则这些属性将用于计算更新的参数值。

这是否意味着渐变和hessians由以下命令提供:

attr(f, 'gradient') <- function(...){...}

此功能的输入和输出应该是什么?

将此与一般优化器stats::optim对比:

optim(par, fn, gr = NULL, ...,
  method = c("Nelder-Mead", "BFGS", "CG", "L-BFGS-B", "SANN",
             "Brent"), ...)

其中渐变被明确指定为optim的参数,作为示例,请参阅:how to propery specify a gradient function for use in optim() or other optimizer

检查nlm的代码内部结构没有帮助。

1 个答案:

答案 0 :(得分:0)

这是一个简单的一维示例:

<?php
include_once("db_conx.php");
$sql = "SELECT * FROM users WHERE AND activated='1' ORDER BY RAND()";
$query = mysqli_query($db_conx, $sql);

$i = 0;
$dynamic_table = '<table border="1" cellpadding="10">';
while ($row = mysqli_fetch_array($query, MYSQLI_ASSOC)) {
    $id = $row["id"];
    $username = $row["username"];

    if ($i % 3 == 0) { // if $i is divisible by our target number (in this case "3")
        $dynamic_table .= '<tr><td>' . $member_name . '</td>';
    } else {
        $dynamic_table .= '<td>' . $member_name . '</td>';
    }
    $i++;
}
$dynamic_table .= '</tr></table>';
?>
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<?php echo $dynamic_table; ?>

</body>
</html>

给出了:

f <- function(x) {
  out <- -exp(-0.5 * x^2)
  attr(out, 'gradient') <- -x * out 
  attr(out, 'hessian') <-  (x^2 - 1) * out
  return(out)
}

nlm(f, 1.3, hessian = TRUE, check.analyticals = TRUE)