我试图在下面的代码片段中找出@(t)的目的是什么:
[theta] = ...
fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), ...
initial_theta, options);lrCostFunction:
function [J, grad] = lrCostFunction(theta, X, y, lambda)
%LRCOSTFUNCTION Compute cost and gradient for logistic regression with
%regularization
% J = LRCOSTFUNCTION(theta, X, y, lambda) computes the cost of using
% theta as the parameter for regularized logistic regression and the
% gradient of the cost w.r.t. to the parameters. 和备选方案:
options = optimset('GradObj', 'on', 'MaxIter', 50);我希望你能解释一下。提前感谢
发布于 2014-07-26 18:03:34
让我回答您的问题,重点是匿名函数本身。
以下函数,在单独的.m文件中定义
function y = foo(x, a, b)
y = x^(a-b);
end等于在主脚本中定义匿名函数。
bar = @(x, a, b) x^(a-b);当主脚本调用函数foo(5, 1, 2)时,Matlab在工作目录中搜索,然后在文件foo.m中读取和执行代码。相反,当您运行一行bar(5, 1, 2)时,Matlab调用一个“功能句柄”并将其视为一个函数(尽管它的功能受到一行代码的限制--您不能轻松地执行switch或for之类的操作)。
有时,我们需要将一些功能封装成一个更易于使用的函数。考虑这样一种情况:我们希望计算foo 1000次,但只需要输入x更改,而a和b则保持不变。当然,在foo(x, 1, 2)循环中编写for是可以的,但是您也可以在进入循环之前包装这个函数。
a = 1;
b = 2;
foobar = @(x) foo(x, a, b); 调用foobar(5)时,Matlab首先调用函数handle foobar,将5作为它的唯一输入。该函数句柄有一个指令:调用另一个函数(或者函数句柄,如果您这样定义的话),名为foo。foo的参数是:x,它是在用户调用foobar(x)时定义的;a和b是在执行函数句柄定义代码之前首先定义的。
在您的例子中,fmincg只接受一个只有一个输入参数的函数,作为它的第一个参数。但是lrCostFunction需要四个。fmincg不知道如何对待x、y或lambda (我也不知道)。因此,您的工作是将成本函数封装到一般优化器可以理解的形式中。这也要求您预先分配x、y、c和lambda。
发布于 2014-07-26 07:23:57
,怎么回事,
@(t)创建一个带有参数t的函数,该函数调用您的costFunction(t,X,y),因此如果您编写
fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), ...
initial_theta, options);它将调用函数lrCostFunction并传递值。
为什么我们需要它
它允许我们使用Octave提供的内置优化函数(因为MATLAB没有fminc函数AFAIK)。因此,它使用您的costFunction并使用您提供的设置对其进行优化。
优化设置
如上所述,optimset('GradObj', 'on', 'MaxIter', 50);允许您设置最小化问题所需的优化设置。
所有信息来自Andrew类。希望能帮上忙..。
如果我错了,请纠正我。
https://stackoverflow.com/questions/24966517
复制相似问题