我试图弄清楚以下代码片段中@(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);
我很欣赏一些解释。提前致谢
答案 0 :(得分:2)
让我回答你关注anonymous function本身的问题。
以下函数,在单独的.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会调用一个"function handle"并将其视为一个函数(虽然它的功能受到一行代码的限制 - 你不能执行像{{1}这样的事情。或者switch
很容易)。
有时候我们需要将一些功能包装成一个更容易使用的功能。考虑一种情况,我们要评估for
1000次,但只输入foo
次更改,而x
和a
保持不变。在b
循环中编写foo(x, 1, 2)
当然可以,但您也可以在进入循环之前包装该函数。
for
当您致电a = 1;
b = 2;
foobar = @(x) foo(x, a, b);
时,Matlab首先调用函数句柄foobar(5)
,将foobar
作为唯一输入。该函数句柄有一条指令:调用名为5
的另一个函数(或函数句柄,如果你定义它)。 foo
的参数是:foo
,在用户调用x
时定义; foobar(x)
和a
,它们是在执行函数句柄定义代码之前首先定义的。
在您的情况下,b
仅接受一个只有一个输入参数的函数作为其第一个参数。但是fmincg
需要四个。 lrCostFunction
不知道如何对待fmincg
,x
或y
(我也不知道)。因此,将成本函数包装到一般优化器可以理解的形式中是您的工作。这还要求您提前分配lambda
,x
,y
和c
。
答案 1 :(得分:1)
它是什么。
@(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 NG课程。我希望它有所帮助..
如果我错了,请纠正我。