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 而不是匿名函数? 这是一种处理方式。其他可能性包括:具有thetaX 的结构,定义所有内容的嵌套函数,文件标识符,...。我认为这取决于用户为其特定情况选择最佳方法。

以上是关于MATLAB 函数 fminunc 生成错误的主要内容,如果未能解决你的问题,请参考以下文章

是否由MATLAB fmincon报告了Hessian矩阵,fminunc是平均Hessian矩阵?

Octave 里的 fminunc

八度:逻辑回归:fmincg 和 fminunc 之间的差异

Matlab中的优化工具包都能求解哪些类型的优化问题?求解的函数是啥?

[Octave] fminunc()

MATLAB Coder 语法错误和不支持的函数