2015-04-12 90 views
1

我想使用Matlab「梯度」和「hessian」函數來計算符號向量函數關於向量的導數。下面是一個使用sigmoid函數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

謝謝,丹尼爾 - 事實證明,問題是沒有使用dot()來取w和x的點積。 diff()和gradient()都給出了相同的解決方案,如下所示:

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)