我在MATLAB中有以下代码:
% Set options for fminunc
options = optimset('GradObj', 'on', 'MaxIter', 400);
% Run fminunc to obtain the optimal theta
% This function will return theta and the cost
[theta, cost] = ...
fminunc(@(t)(costFunction(t, X, y)), initial_theta, options);
我的导师已经解释了最小化功能:
要指定我们最小化的实际功能,我们使用"短手" 用于指定函数,例如
@(t)(costFunction(t, X, y))
。这个 创建一个带有参数t
的函数,该函数调用costFunction
。这个 允许我们将costFunction
打包以便与fminunc
一起使用。
我真的无法理解@(t)(costFunction(t, X, y)
的含义。这两个t
正在做什么?这是什么表达?
答案 0 :(得分:3)
在Matlab中,这被称为匿名函数。
采取以下一行:
f = @(t)( 10*t );
在这里,我们定义一个函数f
,它接受一个参数t
,并返回10*t
。它可以被
f(5) % returns 50
在您的情况下,您正在使用fminunc
,它将一个函数作为其第一个参数,并使用一个参数来最小化。这可以使用
X = 1; y = 1; % Defining variables which aren't passed into the costFunction
% but which must exist for the next line to pass them as anything!
f = @(t)(costFunction(t, X, y)); % Explicitly define costFunction as a function of t alone
[theta, cost] = fminunc(f, 0, options);
这可以通过先不定义f
,然后只调用
[theta, cost] = fminunc(@(t)(costFunction(t, X, y)), 0, options);
进一步阅读
答案 1 :(得分:2)
只是添加了Wolfie的回复。我也很困惑,并在这里问了一个类似的问题: Understanding fminunc arguments and anonymous functions, function handlers
这里的方法是其中之一。匿名函数(下面链接中的3个方法中的1个)解决的问题是求解器fminunc
仅优化传递给它的函数中的一个参数。匿名函数@(t)(costFunction(t, X, y)
是一个新函数,它只接受一个参数t,然后将此值传递给costFunction。您会注意到,在视频讲座中输入的内容只是@costFunction
而且这很有效,因为costFunction
只使用了一个参数theta
。
https://www.mathworks.com/help/optim/ug/passing-extra-parameters.html
答案 2 :(得分:1)
我也有同样的问题。多亏了Wolfie提供的理解paramterized and anonymous functions的链接,我才能够澄清我的疑问。也许,您一定已经找到了答案,但是正在为那些可能在不久的将来开发此查询的人再次说明。
比方说,我们要导出一个多项式,并找到其最小值/最大值。我们的代码是:
m = 5;
fun = @(x) x^2 + m; % function that takes one input: x, accepts 'm' as constant
x = derive(fun, 0); % fun passed as an argument
根据上面的代码,“ fun”是指向我们匿名函数f(x)=x^2 + m
的句柄。它仅接受一个输入,即x。匿名函数的优点是,无需为它创建单独的程序。对于常数“ m”,它可以接受当前workspace中的任何值。
上面的代码可以缩短:
m = 5;
x = derive(@(x) x^2 + m, 0); % passed the anonymous function directly as argument
答案 3 :(得分:0)
我们的目标是找到全局最优值,所以我认为这里的功能是通过更改alpha值获得局部极小值并相互比较以查看哪个最优值。
要实现此目的,您可以使用值initial_theta初始化fminuc
fminuc set t=initial_theta
然后计算CostFunction(t,X,y)
,它等于CostFunction(initial_theta,X,y)。您将获得Cost以及渐变。
fminuc
将计算带有渐变和alpha的new_theta
,然后设置t=new_theta
并再次计算Cost和渐变。
它将像这样循环,直到找到局部最优值为止。
然后,它更改alpha的长度并重复上述操作以获得另一个最优值。最后,它将比较最佳选择并返回最佳选择。