MATLAB 函数 fminunc 生成错误
Posted
技术标签:
【中文标题】MATLAB 函数 fminunc 生成错误【英文标题】:MATLAB function fminunc generates errors 【发布时间】:2014-09-08 13:37:36 【问题描述】:在最大似然估计的上下文中使用函数 fminunc 时遇到错误。恐怕这很简单,但是我对 MATLAB 的经验非常有限。
函数“正常”包含对数似然函数。我试图估计期望和标准。给定存储在变量 x 中的观察值的正态分布偏差。
function f = normal(X, theta)
mean = theta(1);
sigma = theta(2);
z = (X-mean)./sigma;
f = -(sum(-log(sigma) -(1/2).*z.^2 ));
我基本上执行以下代码:
theta = [1,1]
f = @(theta)normal(x, theta)
[est, fval, exitflag, output, grad, hessian] = fminunc('normal', x, theta)
错误如下:
警告:结构字段赋值会覆盖类“double”的值。请参阅 MATLAB R14SP2 版本 注意,将非结构变量分配为结构会显示警告,以了解详细信息。
在 34 处的 createOptionFeedback 在 31 的 prepareOptionsForSolver 在 fminunc 157 警告:结构字段赋值会覆盖类“double”的值。请参阅 MATLAB R14SP2 版本 注意,将非结构变量分配为结构会显示警告,以了解详细信息。 在 fminunc 203 使用 feval 时出错 'double' 类型的输入参数的未定义函数 'normal'。
fminunc 中的错误(第 254 行) f = feval(funfcn3,x,varargin:);
原因: 初始用户提供的目标函数评估失败。 FMINUNC 无法继续。
不幸的是,手册并没有帮助我修复代码。调用
[est, fval, exitflag, output, grad, hessian] = fminunc(f, x, theta)
也没有帮助。我做错了什么?
提前谢谢你!
【问题讨论】:
【参考方案1】:您调用fminunc
时使用了错误的sintax,请参阅文档。
修复代码的一种方法是将函数 normal
定义为只接受一个参数:theta
。
function f = normal(theta)
global X
mean = theta(1);
sigma = theta(2);
z = (X-mean)./sigma;
f = -(sum(-log(sigma) -(1/2).*z.^2 ));
并致电fminunc
global X
X = randn(100, 1); % A possible time series.
theta0 = [1,1];
[est, fval, exitflag, output, grad, hessian] = fminunc(@normal, theta0);
【讨论】:
为什么是global
而不是匿名函数?
这是一种处理方式。其他可能性包括:具有theta
和X
的结构,定义所有内容的嵌套函数,文件标识符,...。我认为这取决于用户为其特定情况选择最佳方法。以上是关于MATLAB 函数 fminunc 生成错误的主要内容,如果未能解决你的问题,请参考以下文章
是否由MATLAB fmincon报告了Hessian矩阵,fminunc是平均Hessian矩阵?
八度:逻辑回归:fmincg 和 fminunc 之间的差异