2014-11-02 75 views
0

在Matlab中,我想創建一個名爲J(theta_0, theta_1)的成本函數的偏導數(以便進行梯度下降所需的計算)。計算一個數學函數的總和的導數-MATP

enter image description here

功能J(theta_0, theta_1)定義爲:

enter image description here

比方說h_theta(x) = theta_1 + theta_2*x。另外:alpha是固定的,給出了起始值theta_1theta_2。假設在這個例子中:alpha = 0.1theta_1 = 0theta_2 = 1另外我有兩個不同的矢量 x和y的所有值。

VectorOfX = 
5 
5 
6 

VectorOfX = 
6 
6 
10 

步驟我走上嘗試在Matlab來解決這個問題:我不知道如何在MATLAB來解決這個問題。所以我開始嘗試在Matlab中定義一個函數,並嘗試這樣做:

theta_1 = 0 
theta_2 = 1 
syms x; 
h_theta(x) = theta_1 + t2*x; 

這工作,但不是我真正想要的。我想要得到x ^(i),這是一個向量。我想接下來的事情是:

theta_1 = 0 
theta_2 = 1 
syms x; 
h_theta(x) = theta_1 + t2*vectorOfX(1); 

這提供了以下錯誤:

Error using sym/subsindex (line 672) 
Invalid indexing or function definition. When defining a 
function, ensure that the body of the function is a SYM 
object. When indexing, the input must be numeric, logical or 
':'. 

Error in prog1>gradientDescent (line 46) 
h_theta(x) = theta_1 + theta_2*vectorOfX(x); 

我擡頭一看這個錯誤,不知道如何解決它爲這個特殊的例子。我感覺我使matlab對我工作,而不是使用它對我有利。

+0

那豈不是更容易區分自己的作用?爲什麼你堅持使用MATLAB來做呢? – Jubobs 2014-11-02 10:17:02

+0

它可能會使它更容易一些,雖然我上面描述的問題仍然會存在。即使有區別,我仍然必須總結範圍h_theta(x ^(i))和y ^(i)。 – Joop 2014-11-02 10:25:27

+0

這是一個家庭作業嗎?如果是這樣,在你的問題中指定它是明智的。 – Jubobs 2014-11-02 11:21:03

回答

1

當我必須執行符號計算時,我更喜歡使用Mathematica。在該環境中,這是獲取您正在尋找的偏導數的代碼。

J[th1_, th2_, m_] := Sum[(th1 + th2*Subscript[x, i] - Subscript[y, i])^2, {i, 1, m}]/(2*m) 
D[J[th1, th2, m], th1] 
D[J[th1, th2, m], th2] 

,並給出

反觀MATLAB我們可以用下面的代碼

%// Constants. 
alpha = 0.1; 
theta_1 = 0; 
theta_2 = 1; 
X = [5 ; 5 ; 6]; 
Y = [6 ; 6 ; 10]; 

%// Number of points. 
m = length(X); 

%// Partial derivatives. 
Dtheta1 = @(theta_1, theta_2) sum(2*(theta_1+theta_2*X-Y))/2/m; 
Dtheta2 = @(theta_1, theta_2) sum(2*X.*(theta_1+theta_2*X-Y))/2/m; 

%// Loop initialization. 
toll = 1e-5; 
maxIter = 100; 
it = 0; 
err = 1; 
theta_1_Last = theta_1; 
theta_2_Last = theta_2; 

%// Iterations. 
while err>toll && it<maxIter 
    theta_1 = theta_1 - alpha*Dtheta1(theta_1, theta_2); 
    theta_2 = theta_2 - alpha*Dtheta2(theta_1, theta_2); 

    it = it + 1; 
    err = norm([theta_1-theta_1_Last ; theta_2-theta_2_Last]); 
    theta_1_Last = theta_1; 
    theta_2_Last = theta_2; 
end 

不幸的是,這種情況下,迭代不收斂解決這個問題。

MATLAB是不是象徵性的計算非常靈活,但是有辦法讓這些偏導數以下

m = 10; 
syms th1 th2 
x = sym('x', [m 1]); 
y = sym('y', [m 1]); 
J = @(th1, th2) sum((th1+th2.*x-y).^2)/2/m; 
diff(J, th1) 
diff(J, th2)