2016-03-11 13 views
5

Robię kurs Andrew Ng na temat uczenia maszynowego i staram się owijać głowę wokół wektorowej implementacji gradientowego zejścia dla wielu zmiennych, co jest opcjonalnym ćwiczeniem w kurs.Implementacja gradientowego zejścia dla wielu zmiennych w Octave przy użyciu "sumy"

Jest to algorytm w pytaniu (zaczerpnięte z here):

enter image description here

Po prostu nie mogę tego zrobić w oktawie użyciu sum choć nie jestem pewien, jak pomnożyć sumę hipotezy x (i) - y (i) według wszystkich zmiennych xj (i). Próbowałem różnych iteracji następującego kodu, ale bezskutecznie (zarówno wymiary nie są dobre czy odpowiedź jest źle):

theta = theta - alpha/m * sum(X * theta - y) * X; 

Prawidłowa odpowiedź jest jednak zupełnie nieoczywiste (do liniowego początkującego algebry w każdym razie, jak ja z here):

theta = theta - (alpha/m * (X * theta-y)' * X)'; 

Czy istnieje zasada, w przypadkach, w których bierze udział sum który reguluje przemiany jak wyżej?

A jeśli tak, czy istnieje przeciwna wersja powyższego (tj. Przejście z rozwiązania opartego na sum do ogólnego mnożenia), ponieważ udało mi się wymyślić poprawną implementację przy użyciu sum dla gradientowego zejścia dla pojedynczej zmiennej (choć nie bardzo elegancki jeden):

temp0 = theta(1) - (alpha/m * sum(X * theta - y)); 
temp1 = theta(2) - (alpha/m * sum((X * theta - y)' * X(:, 2))); 

theta(1) = temp0; 
theta(2) = temp1; 

Należy pamiętać, że dotyczy to tylko wektoryzowane implementacje i choć istnieje kilka pytań na temat, tak aby, jak to zrobić, moje pytanie dotyczy przede wszystkim realizacji algorytmu w Octave przy użyciu sum.

+2

Możliwy duplikat [uczenia maszynowego - regresja liniowa z zastosowaniem gradientu wsadowy zejście] (http://stackoverflow.com/questions/32274474/machine-learning-linear-regression- using-batch-gradient-descent) – rayryeng

+1

Spójrz na duplikat łącza - w szczególności drugie podejście z 'sumą'. – rayryeng

Odpowiedz

4

Generał „reguła kciuka” jest następująca, jeśli pojawią się coś w postaci

SUM_i f(x_i, y_i, ...) g(a_i, b_i, ...) 

następnie można łatwo wektorować go (i to, co zostało zrobione w wyżej) przez

f(x, y, ...)' * g(a, b, ...) 

Ponieważ jest to po prostu typowy produkt kropka, która w matematyce (w przestrzeni euklidesowej skończonego wymiaru) wygląda

<A, B> = SUM_i A_i B_i = A'B 

zatem

(X * theta-y)' * X) 

tylko

<X * theta-y), X> = <H_theta(X) - y, X> = SUM_i (H_theta(X_i) - y_i) X_i 

jak widać to działa w obie strony, jak to tylko matematyczna definicja iloczynu skalarnego.

1

Odwołując się do tej części twojego pytania - "Nie jestem pewien, jak pomnożyć sumę hipotezy x (i) - y (i) przez wszystkie zmienne xj (i)."

W Octave można pomnożyć xj (i) do wszystkich prognoz używając ".”, Więc może być zapisany jako:

m = size(X, 1); 
predictions = X * theta; 
sqrErrors = (predictions-y).^2; 
J = 1/(2*m) * sum(sqrErrors); 
Powiązane problemy