Machine Learning - Lineare Regression mit Batch-Gradienten-Abstieg

7

Ich versuche, Batch-Gradienten-Abstieg auf einem Datensatz mit einer einzigen Funktion und mehreren Trainingsbeispielen ( m ) zu implementieren.

Wenn ich versuche, die normale Gleichung zu verwenden, bekomme ich die richtige Antwort, aber die falsche Antwort mit dem folgenden Code, der in MATLAB einen Batch-Gradienten-Abstieg durchführt.

%Vor%

y ist der Vektor mit Zielwerten, X ist eine Matrix mit der ersten Spalte voller Einsen und zweiten Spalten mit Werten (Variable).

Ich habe dies unter Verwendung der Vektorisierung implementiert, d. h.

%Vor%

... wobei delta ein 2-Elemente-Spaltenvektor ist, der auf Nullen initialisiert wird.

Die Kostenfunktion J(Theta) ist 1/(2m)*(sum from i=1 to m [(h(theta)-y)^2]) .

    
Sridhar Thiagarajan 28.08.2015, 15:20
quelle

1 Antwort

23

Der Fehler ist sehr einfach. Ihre delta -Deklaration sollte innerhalb der ersten for -Schleife sein. Jedes Mal, wenn Sie die gewichteten Unterschiede zwischen Trainingsbeispiel und Ausgabe akkumulieren, sollten Sie von Anfang an ansammeln.

Wenn Sie dies nicht tun, werden die Fehler aus der vorherigen Iteration akkumuliert, wodurch der Fehler der vorherigen gelernten Version von theta berücksichtigt wird, der nicht korrekt ist. Sie müssen dies am Anfang der ersten for -Schleife setzen.

Außerdem scheint es, dass Sie einen fremden computeCost -Aufruf haben. Ich nehme an, dies berechnet die Kostenfunktion bei jeder Iteration mit den aktuellen Parametern, und deshalb werde ich ein neues Ausgabe-Array namens cost erstellen, das Ihnen dies bei jeder Iteration zeigt. Ich werde diese Funktion auch aufrufen und sie den entsprechenden Elementen in diesem Array zuweisen:

%Vor%

Eine Anmerkung zur richtigen Vektorisierung

FWIW, ich betrachte diese Implementierung nicht als vollständig vektorisiert. Sie können die zweite for -Schleife eliminieren, indem Sie vektorisierte Operationen verwenden. Bevor wir das tun, lassen Sie mich etwas Theorie behandeln, damit wir auf der gleichen Seite sind. Sie verwenden Gradientenabstieg hier in Bezug auf die lineare Regression. Wir wollen die besten Parameter theta suchen, die unsere linearen Regressionskoeffizienten sind, die versuchen, diese Kostenfunktion zu minimieren:

m entspricht der Anzahl der Trainingsbeispiele, die wir zur Verfügung haben und x^{i} entspricht dem i th Trainingsbeispiel. y^{i} entspricht dem Grundwahrheitswert, den wir mit der Trainingsstichprobe assoziiert haben. h ist unsere Hypothese und wird wie folgt angegeben:

Beachten Sie, dass wir im Zusammenhang mit der linearen Regression in 2D nur zwei Werte in theta haben, die wir berechnen wollen - den Schnittpunkt und die Steigung.

Wir können die Kostenfunktion J minimieren, um die besten Regressionskoeffizienten zu bestimmen, die uns die besten Vorhersagen geben, die den Fehler des Trainingssatzes minimieren. Insbesondere beginnend mit einigen anfänglichen theta -Parametern ... normalerweise ein Vektor von Nullen, iterieren wir über Iterationen von 1 bis zu so vielen, wie wir für richtig halten, und bei jeder Iteration aktualisieren wir unsere theta -Parameter durch diese Beziehung:

Für jeden Parameter, den Sie aktualisieren möchten, müssen Sie den Gradienten der Kostenfunktion in Bezug auf jede Variable ermitteln und bewerten, was sich im aktuellen Status von theta befindet. Wenn Sie dies mit Hilfe von Kalkül herausfinden, erhalten wir:

Wenn Sie nicht wissen, wie diese Ableitung zustande gekommen ist, dann verweise ich Sie auf diesen netten Mathematics Stack Exchange-Beitrag, der darüber spricht:

Ссылка

Nun ... wie können wir das auf unser aktuelles Problem anwenden? Insbesondere können Sie die Einträge von delta relativ einfach berechnen, indem Sie alle Stichproben gleichzeitig analysieren. Was ich meine ist, dass Sie das einfach tun können:

%Vor%

Die Operationen delta(1) und delta(2) können für beide in einer einzigen Anweisung vollständig vektorisiert werden. Was machen Sie theta^{T}*X^{i} für jede Probe i von 1, 2, ..., m . Sie können dies bequem in eine einzige sum -Anweisung einfügen.

Wir können noch weiter gehen und dies durch reine Matrixoperationen ersetzen. Zunächst einmal, was Sie tun können, ist theta^{T}*X^{i} für jeden Eingabe-Sample X^{i} sehr schnell mit Matrixmultiplikation zu berechnen. Angenommen, wenn:

Hier ist X unsere Datenmatrix, die aus m Zeilen besteht, die m Trainingsproben entsprechen, und n Spalten, die n -Features entsprechen. In ähnlicher Weise ist theta unser erlernter Gewichtsvektor aus Gradientenabstieg mit n+1 -Features, die für den Abschnittzeitpunkt verantwortlich sind.

Wenn wir X*theta berechnen, erhalten wir:

Wie Sie hier sehen können, haben wir die Hypothese für jede Probe berechnet und jede in einen Vektor platziert. Jedes Element dieses Vektors ist die Hypothese für die Trainingsstichprobe. Nun erinnern Sie sich, was der Gradientenbegriff jedes Parameters im Gradientenabstieg ist:

Wir möchten dies für alle Parameter in Ihrem gelernten Vektor auf einmal implementieren, und wenn wir dies in einen Vektor einfügen, erhalten wir:

Schließlich:

Daher wissen wir, dass y bereits ein Vektor der Länge m ist, und so können wir den Gradientenabfall bei jeder Iteration sehr kompakt berechnen durch:

%Vor%

.... so ist dein Code jetzt nur noch:

%Vor%     
rayryeng 28.08.2015, 15:37
quelle