0

我想最小化这个功能:

function [GCV2]=GCV(y,x,k)

[n, p]=size(x);

A=(x'*x+k*eye(p));
A=A\x';
A=x*A;

I_mat=eye(n);

num2=(I_mat-A);
num2=num2*y;
num2=norm(num2);
num2=num2^2;
num2=num2/n;

%(norm((I_mat-A)*y)^2)/n;
den2=(I_mat-A);
den2=trace(den2);
den2=den2/n;
den2=den2^2;

GCV2=num2/den2;

end

和值分别是 13×4)xy13×1 数组,这些值已经在 Matlab 工作区中定义。我想优化该k值,以使函数值GCV最小化。

被优化的参数和输出都是标量的,所以fminsearch应该是合适的。

但我不能让它运行?

我尝试了几种方法,最新的是:

k_min = fminsearch(@GCV,(x;y;0));
??? k_min = fminsearch(@GCV,(x;y;0));
                              |
Error: Unbalanced or unexpected parenthesis or bracket.

我究竟做错了什么?

4

2 回答 2

1

第二个输入fminsearch是起始参数(即k0),因此指定起始值k。然后,您可以定义一个匿名辅助函数并对其进行优化:

>> % define x,y
>> GCVk = @(k) GCV(y,x,k);
>> k0 = 0;
>> k_min = fminsearch(GCVk,k0)

可能还有另一种方法可以做到这一点,但这是为优化器传递附加参数的列出的方法之一。

既然第一名没有加分,那幽默感怎么样。让我们举个例子:

>> x=1; y=1;
>> GCVk = @(k) x+y+k; k0=0;
>> k_min = fminsearch(GCVk,k0)

Exiting: Maximum number of function evaluations has been exceeded
         - increase MaxFunEvals option.
         Current function value: -316912650057057490000000000.000000 

k_min =
  -3.1691e+26

找到了——世界上最小的数字(减 2)!利润?

于 2013-11-11T21:20:19.333 回答
1

看起来您正在学习匿名函数fminsearch最小化单个变量(可能是向量)。因此,您的目标函数必须只有一个输入。您有一个函数 ,GCV它需要三个输入。两个是静态的,在最小化之外的工作区中定义,而k一个是要最小化的。要创建一个来自 的输入的函数GCV,您可以使用任何匿名函数,注意指定哪些变量是参数:

x = ...
y = ...
k0 = 0;
k_min = fminsearch(@(k)GCV(y,x,k),k0);
于 2013-11-11T21:20:25.960 回答