在Matlab函数中使用方程转换?

时间:2018-01-23 03:28:38

标签: matlab function optimization anonymous-function mle

所以,我不确定提出这个问题的最明确方式是什么,但我认为这是我的错,问题相对简单。我正在尝试编写一个非常基本的均值似然估计函数,该函数依赖于优化工具箱的fminsearch()函数。我尝试将函数句柄作为输入传递并优化neg的总和。函数的日志。我的代码是:

function [ params, max ] = routine( fun )
%UNTITLED3 Summary of this function goes here
%   Detailed explanation goes here

[filename,path] = uigetfile('*.'); #To grab the csv file location
name = strcat(path,filename);
data = csvread(name);

lh = @(x) sum(-log( fun(x) )); <-------- ERROR LINE

options = optimset('Display', 'off', 'MaxIter', 100000, 'TolX', 10^-20, 'TolFun', 10^-20);
[theta, max1] = fminsearch(lh, [0,1], options);

params = theta
max = max1

end

中间的一行给了我这个错误:

Undefined function or variable 'data'.

Error in @(x)(1/(sqrt(2*pi)*x(2)))*exp((-(data-x(1)).^2)/(2*x(2)^2))

Error in @(x)sum(-log(fun(x)),data)

Error in fminsearch (line 200)
fv(:,1) = funfcn(x,varargin{:});

现在,在这段代码之外,这个工作完全正常,令人愤怒。

pan = @(x)sum(-log((1/(sqrt(2*pi)*x(2)))*exp((-(data-x(1)).^2)/(2*x(2)^2))));
options = optimset('Display', 'off', 'MaxIter', 100000, 'TolX', 10^-20, 'TolFun', 10^-20);
[theta, max1] = fminsearch(pan, [0,1], options);

出于某种原因,按照我在中间的方式转换方程会产生data var。无形。我应该如何正确地将变换应用到我的等式中,以便此代码有效?任何帮助都将非常感激。

1 个答案:

答案 0 :(得分:1)

在匿名函数上查看the documentation。这是相关部分

  

表达式中的变量

     

函数句柄不仅可以存储表达式,还可以存储表达式用于评估的变量。

     

例如,为匿名函数创建一个函数句柄   需要系数abc

a = 1.3;
b = .2;
c = 30;
parabola = @(x) a*x.^2 + b*x + c;
     

由于abc在您创建parabola时可用,功能   句柄包括那些值。值保留在函数中   处理即使您清除变量:

clear a b c
x = 1;
y = parabola(x)
     

y = 31.5000

     

要为系数提供不同的值,您必须创建一个新的函数句柄

在您的情况下,您读入的data的值将无法用于fun,因为函数句柄是在data之前定义的。相反,我们可以将data作为fun的参数,然后我们一起避免这个问题。

调用代码

myfun = @(x,data) (1/(sqrt(2*pi)*x(2)))*exp((-(data-x(1)).^2)/(2*x(2)^2));
[params,max] = routine(myfun);

routine.m (需要更改的位)

function [ params, max ] = routine( fun )
...
lh = @(x) sum(-log( fun(x,data) ));
...
end