我想尽量减少这个功能:
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
x
和y
值分别为13 x 4)和13 x 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.
我做错了什么?
答案 0 :(得分:1)
fminsearch
的第二个输入是起始参数(即k0
),因此请指定起始值k
。然后,您可以定义匿名帮助函数并对其进行优化:
>> % define x,y
>> GCVk = @(k) GCV(y,x,k);
>> k0 = 0;
>> k_min = fminsearch(GCVk,k0)
可能有另一种方法可以执行此操作,但这是优化程序列出的passing additional parameters方法之一。
由于首先没有奖励积分,幽默怎么样。我们举个例子:
>> 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)!利润是多少?
答案 1 :(得分:1)
看起来您正在了解anonymous functions。 fminsearch
最小化单个变量(可以是向量)。因此,您的目标函数必须只有一个输入。你有一个函数GCV
,它有三个输入。两个是静态的,并且在最小化之外的工作空间中定义,而k
是要最小化的那个。要使用GCV
中的一个输入创建函数,您可以使用任何匿名函数,注意指定哪些变量是参数:
x = ...
y = ...
k0 = 0;
k_min = fminsearch(@(k)GCV(y,x,k),k0);