2015-04-12 5 views
1

Я пытаюсь использовать функции градиента Matlab и «hessian» для вычисления производной символьной векторной функции по отношению к вектору. Ниже приведен пример использования сигмоидной функции 1/(1 + e^(- a)), где a - вектор признаков, умноженный на веса. Все версии, приведенные ниже, возвращают ошибку. Я новичок в Matlab и очень ценю любые советы. Решение может быть у меня под носом в documentation, но я не смог решить проблему. Заранее спасибо за вашу помощь!Вычисление градиента Matlab и вычисление hessian для символьной векторной функции

%version 1 
syms y w x 
x = sym('x', [1 3]); 
w = sym('w', [1 3]); 
f = (y-1)*w.*x + log(1/(1+exp(-w.*x))); 
gradient(f, w) 

%version 2 
syms y w1 w2 w3 x1 x2 x3 x w 
x = [x1,x2,x3]; 
w = [w1,w2,w3]; 
f = (y-1)*w.*x + log(1/(1+exp(-w.*x))); 

%version 3 
syms y w1 w2 w3 x1 x2 x3 
f = (y-1)*[w1,w2,w3].*[x1,x2,x3] + log(1/(1+exp(-[w1,w2,w3].*[x1,x2,x3]))); 
+0

Не могли бы вы объяснить, почему вы используете символическую математику, а затем применяете числовые методы? Есть ли причина, по которой вы не используете 'diff'? – Daniel

ответ

1

Спасибо, Даниэль. Оказывается, проблема заключалась в том, что не использовалась точка() для получения точечного произведения w и x. И diff(), и градиент() дали такое же решение, как показано ниже:

syms y 
x = sym('x', [1 3]); 
w = sym('w', [1 3]); 
f = (y-1)*dot(w,x) + log(1/(1+exp(dot(-w,x)))); 
diff(f, w(1)) 
gradient(f, w(1)) 

%ans = 
%x1*(y - 1) + (x1*exp(- x1*conj(w1) - x2*conj(w2) - x3*conj(w3)))/ 
    (exp(-x1*conj(w1) - x2*conj(w2) - x3*conj(w3)) + 1) 
Смежные вопросы