tun müssen, was Sie im ersten Beispiel in dem zweiten Block tun Sie einen Schritt verpasst haben haben Sie nicht? Ich nehme an, dass Sie X mit einem Vektor von Einsen verkettet haben.
temp=X(:,2) * temp
Das letzte Beispiel wird funktionieren, kann aber noch mehr vektorisiert werden, um einfacher und effizienter zu sein.
Ich habe angenommen, Sie haben nur 1 Funktion. Es wird das gleiche mit mehreren Funktionen funktionieren, da Sie nur eine zusätzliche Spalte zu Ihrer X-Matrix für jede Funktion hinzufügen. Im Grunde fügst du einen Vektor von Einsen zu x hinzu, um den Achsenabschnitt zu vektorisieren.
Sie können eine 2x1 Matrix von Theta in einer Codezeile aktualisieren. Mit x verketten Sie einen Vektor von Einsen, die ihn zu einer nx2-Matrix machen, dann können Sie h (x) berechnen, indem Sie mit dem Theta-Vektor (2x1) multiplizieren, das ist (X * Theta) -Bit.
Der zweite Teil der Vektorisierung ist (X * theta) transponieren - y), die man eine 1 * N Matrix gibt, die, wenn multipliziert mit X (wird eine n * 2-Matrix) aggregieren grundsätzlich sowohl (h (x) -y) x0 und (h (x) -y) x1. Per Definition sind beide Thetas gleichzeitig erledigt. Dies führt zu einer 1 * 2-Matrix meiner neuen Thetas, die ich einfach erneut transponiere, um den Vektor umzuschalten, um dieselben Dimensionen wie der Theta-Vektor zu haben. Ich kann dann eine einfache Skalarmultiplikation durch Alpha- und Vektorsubtraktion mit Theta durchführen.
X = data(:, 1); y = data(:, 2);
m = length(y);
X = [ones(m, 1), data(:,1)];
theta = zeros(2, 1);
iterations = 2000;
alpha = 0.001;
for iter = 1:iterations
theta = theta -((1/m) * ((X * theta) - y)' * X)' * alpha;
end
Ich denke nicht, das eine ordnungsgemäße Durchführung der Gradientenabfallsaktualisierung ist. Sie müssen aktualisieren. Beide deine Thetas gleichzeitig um genau zu sein. 'tmpTheta1 = Theta (1) - Alpha * (1/m) * ((X * Theta) - y) '* X (: 1); tmpThea2 = Theta (2) - Alpha * (1/m) * ((X * Theta) - y) '* X (:, 2); ' ' Theta (1) = tmpTheta1; ' ' Theta (2) = tmpTheta2; ' –