【问题标题】:vectorized function fminsearch矢量化函数 fminsearch
【发布时间】:2012-02-25 21:44:27
【问题描述】:

首先非常感谢。第一个代码运行良好:
函数 f=malibu(m1,m2,m3,k,l,t) f=(m1.*k+(m1+m2).*l).*exp(-m3.*t); 结束

function loglik= modelmalibu(p)
global k l t x n m2 m3;
f =malibu(p,m2,m3,k,l,t);
if f==0;
    loglik0=0;
else
loglik0=(x.*log(f)+(n-x).*log(1-f));%minus likelihood
end
loglik=sum(-loglik0);
end

clear all;
global n t x k l m2 m3;
m1=0.1;
m2=0.2;
m3=0.3;
t=[1 3 6 9 12 18]';
k=[1 1 2 3 3 4]';
l=[0 0 1 3 4 5]';
y=meltem(m1,m2,m3,k,l,t);
n=100;%trial
x=y.*n;%correct replies
pstart=0.3;
[p1,modelvalue]=fminsearch(@modelmalibu,pstart);

但是更多变量的类似代码给出了错误。

function w=anemon(m1,m2,m3,X,Y,k,l)
w=(m1.*k+(m1+m2).*l)+X.*exp(-m3.*Y);
end

function loglik= modelanemon(p)
global n x m2 m3 X Y k l ;
f =anemon(p,m2,m3,X,Y,k,l);
if f==0;
    loglik0=0;
else
loglik0=(x*log(f)+(n-x)*log(1-f));%minus likelihood
end
loglik=sum(-loglik0);
end

clear;
global n x Ydata kdata ldata m1 m2 m3;
%parameters
m1=0.002;
m2=0.0001;
m3=7;
%given data
Xdata=[1 3 6 9 10 12]';
Ydata=[11 13 41 81 121 181]';
kdata=[1 1 2 4 5 4]';
ldata=[1 1 3 3 4 5]';
y=anemon(m1,m2,m3,Xdata,Ydata,kdata,ldata);
n=10;
x=y.*n;
pstart=2;
[pbest,modelvalue]=fminsearch(@modelanemon,pstart);

我实际上已经尝试使用您的建议,但如果我写一个不等式而不是 f==0,那么第一个代码也会失败。

【问题讨论】:

  • 看起来你所有的“Mfile”都只包含 cmets。这些文件的每一行前面真的有“%”吗?如果是这种情况,那么您的代码并没有做太多。否则,请编辑您的帖子。
  • @Kavka,感谢您的评论。我只想强调 M-Files 的部分,但在您的评论之后我看到这个想法是多么令人困惑。我按照你的建议编辑了它。
  • 我无法理解您的问题。你能澄清一下吗? - 可能是一个小的 sn-p,或者一个特定的例子。
  • @bdecaf,感谢您的关注。当我为像“anemon”这样的基本功能定义模型并想在 fminsearch 中使用它时,它会运行。然后我想如果我有很多复杂的情况会发生什么。我编写的每一个 Mfile 函数,单独运行良好。例如:interpanemon(3,5,m1,m2,m3,Z,X,Y,4,3)。但是 fminsearch 不喜欢复杂的函数。首先,我认为我应该对我的函数进行 vektorize,但它也不起作用。可能在这种情况下,fminsearce 假设参数是恒定的。实际上,我不确定。

标签: matlab math mathematical-optimization


【解决方案1】:

我认为您混淆了两个概念。

矢量化: 确实提到了如何编写代码,以便它可以使用 CPU 中的一些加速功能。它与 fminsearch 无关。见:http://en.wikipedia.org/wiki/Vectorization_(parallel_computing)

我想你想编写你的函数,让它接受一个向量作为输入。最简单的方法是只使用这样的函数句柄:

fh = @(x) my_complicated_function(const1, const2, x(1), x(2), x(3) )

在这种情况下,my_complicated_function 有 5 个输入,您取前 2 个常量并为其他 3 个输入一个 3 个暗淡向量。Fminsearch 将使用它。

你会打电话

 x_opt = fminsearch(fh, [1,2,3])

除了一些代码提示:

  • 不要使用== 来比较数字 - 例如。改为abs(x1-x2)<0.1
  • interpanemon 看起来很奇怪——它不会做所谓的插值,如果你看的话——在每次迭代中 p 都会重新计算,所以只有最后一次计算才会生效。看起来它应该输出一个常量值 - 没有用优化它。
  • 使用预先计算的 Z 可能不是您想要的。它已经确定了您的最佳状态。如果您使用线性优化,则最优值必须已经在 Z 中 - 无需进行插值。
  • 您的案例中的调用可能如下所示:

    min_p = fminsearch(@(x) interpanemon(5,Ydata,x,m2,m3,Z,X,Y,kdata,ldata) ,1)

总体而言,它看起来非常不寻常 - 如果您能解释一下为什么选择这样做,它会非常有帮助。如果您以更简单的形式重申问题,也可能会有所帮助。

【讨论】:

  • ,非常感谢您的帮助。显然,我是个白痴,但我还是不太明白。如果我不打扰您,请您解释一下:一开始我假设我没有任何数据。我创建了函数 anemon(m1,m2,m3,X,Y,k,l),借助这个函数我在网格 (X(i) 上创建了一个函数 Z(i,j,k,l), Y(j))。然后我确定网格点之间的点 Xstar, Ystar) 的函数并写入 interpanemon(Xstar,Ystar,m1,m2,m3,Z,X,Y,k,l)。然后我得到一些数据并想要最小化 interpanemon(5,Ydata,p,m2,m3,Z,X,Y,kdata,ldata) fminsearch 应该为 p 做,但是 :(.
  • hmmm...起初我发现您的代码存在一些问题。我添加了一些提示。
  • 变量号。我遇到了麻烦:(function w=anemon(m1,m2,m3,X,Y,k,l) w=(m1.*k+(m1+m2).*l)+X.*exp(-m3.*Y); end 和模型 function loglik= modelanemon(p) global n x m2 m3 X Y k l ; f =anemon(p,m2,m3,X,Y,k,l); if f==0; loglik0=0; else loglik0=(x*log(f)+(n-x)*log(1-f));%minus likelihood end loglik=sum(-loglik0); end 不能使用下面的相同脚本运行
  • %script anemon clear; global n x Ydata kdata ldata m1 m2 m3; %parameters m1=0.002; m2=0.0001; m3=7; %given data Xdata=[1 3 6 9 10 12]'; Ydata=[11 13 41 81 121 181]'; kdata=[1 1 2 4 5 4]'; ldata=[1 1 3 3 4 5]'; y=anemon(m1,m2,m3,Xdata,Ydata,kdata,ldata); n=10; x=y.*n; pstart=2; [pbest,modelvalue]=fminsearch(@modelanemon,2)
  • 运行良好function f=malibu(m1,m2,m3,k,l,t) f=(m1.*k+(m1+m2).*l).*exp(-m3.*t); end 和模型function loglik= modelmalibu(p) global k l t x n m2 m3; f =malibu(p,m2,m3,k,l,t); if f==0; loglik0=0; else %f=(f<ones(41,1)).*f+(f>ones(41,1))*1;%0<f<1 loglik0=(x.*log(f)+(n-x).*log(1-f));%minus likelihood end loglik=sum(-loglik0); end with scriptclear all; global n t x k l m2 m3; m1=0.1; m2=0.2; m3=0.3; t=[1 3 6 9 12 18]'; k=[1 1 2 3 3 4]'; l=[0 0 1 3 4 5]'; y=meltem(m1,m2,m3,k,l,t); n=100;%trial x=y.*n;%correct replies pstart=0.3; [p1,modelvalue]=fminsearch(@modelmalibu,pstart);
猜你喜欢
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多