【问题标题】:Use transformation of an equation within a Matlab function?在 Matlab 函数中使用方程的变换?
【发布时间】:2018-01-23 03:28:37
【问题描述】:

我正在尝试编写一个非常基本的平均似然估计函数,该函数依赖于优化工具箱的 fminsearch() 函数。我尝试将函数句柄作为输入传递并优化否定的总和。函数的日志。我的代码是:

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。无形的。我应该如何正确地将转换应用于我的方程,以便此代码有效?

【问题讨论】:

    标签: matlab function optimization anonymous-function mle


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多