2013-11-11 2 views
0

я хочу, чтобы минимизировать эту функцию:fminsearch с векторными входами

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-по-4) и 13 на 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. 

Что я делаю неправильно?

ответ

1

Похоже, вы узнали о anonymous functions. fminsearch минимизирует одну переменную (которая может быть вектором). Следовательно, ваша целевая функция должна иметь только один вход. У вас есть функция, GCV, которая принимает три входа. Два являются статическими и определены в рабочей области за пределами минимизации, а k - это тот, который должен быть сведен к минимуму. Чтобы создать функцию с одним входом от GCV, вы можете использовать любую анонимную функцию, стараясь указать, какие переменные являются параметрами:

x = ... 
y = ... 
k0 = 0; 
k_min = fminsearch(@(k)GCV(y,x,k),k0); 
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) в мире! Прибыль?