我正在尝试使用Octave的fminsearch函数,我以前在MATLAB中使用过它。该函数似乎没有充分记录(至少对我来说),我不知道如何设置选项,以实际上最小化。
我尝试使用此消息末尾的代码拟合一个非常简单的指数函数。我想要以下内容:
我希望函数将x和y值作为输入,就像MATLAB一样。此外,我想要对选项进行一些控制,以确保它实际上最小化(即最小化!)
当然,最后我想要拟合比指数更复杂的函数,但我希望能够至少适应指数。
我对fminsearch有几个问题:
我尝试将x和y值移交给函数,但是像这样的matlab风格的东西:
[xx,fval]=fminsearch(@exponential,[1000 1],x,y);
或
[xx,fval]=fminsearch(@exponential,[33000 1],options,x,y)
产生错误:
错误:选项(6)与已知算法不对应 错误:来自: 错误:/opt/local/share/octave/packages/optim-1.0.6/fmins.m第72行,第16栏 错误:/opt/local/share/octave/packages/optim-1.0.6/fminsearch.m第29行,第4栏
或者分别(对于上面的第二种情况):
错误:'x'未定义在第4行第3列附近 错误:来自: 错误:/Users/paul/exponential.m在第4行第2列 错误:/opt/local/share/octave/packages/optim-1.0.6/nmsmax.m,第63行,第6列
错误:/opt/local/share/octave/packages/optim-1.0.6/fmins.m第77行第9列 错误:/opt/local/share/octave/packages/optim-1.0.6/fminsearch.m第29行,第4栏
显然,fminsearch
所采用的参数顺序与MATLAB中的参数顺序不同。那么,这个命令怎么样?
如何让fminsearch
获取值和选项?
我找到了一个问题,解决了该函数不会取值的问题:我将x和y值定义为全局值。不优雅,但至少在功能中可以使用这些值
尽管如此,fminsearch
并未恰当地最小化
如下所示:
这是功能:
function f=exponential(coeff)
global x
global y
X=x;
Y=y;
a= coeff(1);
b= coeff(2);
Y_fun = a .* exp(-X.*b);
DIFF = Y_fun - Y;
SQ_DIFF = DIFF.^2;
f=sum(SQ_DIFF);
end
以下是代码:
global x
global y
x=[0:1:200];
y=4930*exp(-0.0454*x);
options(10)=10000000;
[cc,fval]=fminsearch(@exponential,[5000 0.01])
这是输出:
cc =
4930.0 5184.6
fval = 2.5571e + 08
为什么fminsearch
找不到解决方案?
答案 0 :(得分:1)
无论选项是什么,优化函数fminsearch
都将始终尝试找到最小值。因此,如果您发现它没有找到最小值,那是因为它没有这样做。
从您提供的代码中,我无法确定出现了什么问题。使用全局变量的解决方案应该可以工作,而确实在这里工作,所以你身边的其他东西必须出错。 (注意:我使用MATLAB,而不是Octave,所以这两个函数可能会略有不同......)
无论如何,为什么不这样做呢?
function f = exponential(coeff)
x = 0:1:200;
y = 4930*exp(-0.0454*x);
a = coeff(1);
b = coeff(2);
Y_fun = a .* exp(-x.*b);
f = sum((Y_fun-y).^2);
end
或者,如果您必须将x
和y
作为外部参数传递,
x = [0:1:200];
y = 4930*exp(-0.0454*x);
[cc,fval] = fminsearch(@(c)exponential(c,x,y),[5000 0.01])
function f = exponential(coeff,x,y)
a = coeff(1);
b = coeff(2);
Y_fun = a .* exp(-x.*b);
f = sum((Y_fun-y).^2);
end
答案 1 :(得分:1)
octave-forge包“optim”中有一个fminsearch实现。 您可以在其实现文件中看到第三个参数始终是一个选项向量,第四个参数始终是一个渐变向量,因此您的x,y调用将不起作用。
您还可以在实现中看到它调用fmins实现。
该fmins实施的文档说明:
if options(6)==0 && options(5)==0 - regular simplex
if options(6)==0 && options(5)==1 - right-angled simplex
Comment: the default is set to "right-angled simplex".
this works better for me on a broad range of problems,
although the default in nmsmax is "regular simplex"
最近我的一个问题可以通过matlab的fminsearch解决,但不能用这个octave-forge实现。我不得不指定一个选项向量[0 1e-3 0 0 0 0]让它使用常规单纯形而不是“直角单形”。如果你的系数在规模上有很大差异,那么八度默认是没有意义的。