Что вы делаете в первом примере, во втором блоке вы пропускали шаг не так ли? Я предполагаю, что вы объединили X с вектором единиц.
temp=X(:,2) * temp
Последний пример будет работать, но может быть векторизован еще более простым и эффективным.
Я предположил, что у вас есть только 1 функция. он будет работать одинаково с несколькими функциями, поскольку все, что происходит, - это добавить дополнительный столбец к вашей матрице X для каждой функции. В основном вы добавляете вектор из них в x для векторизации перехвата.
Вы можете обновить матрицу 2x1 в одной строке кода. При х конкатенировать вектор тех, которые делают его матрицей nx2, тогда вы можете вычислить h (x), умножив его на тэта-вектор (2x1), это бит (X * theta).
Вторая часть векторизации - это транспонирование (X * theta) - y), которая дает вам 1 * n матрицу, которая при умножении на X (матрица n * 2) будет в основном суммировать оба (h (x) -y) x0 и (h (x) -y) x1. По определению оба эти метода выполняются в одно и то же время. Это приводит к 1 * 2 матрице моей новой теты, которую я просто транспонирую снова, чтобы перевернуть вектор так же, как тета-вектор. Затем я могу сделать простое скалярное умножение путем альфа-и векторного вычитания с тета.
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
Я не думаю, что это правильное выполнение градиентного спуска. Вам нужно обновить. Оба ваши тета в то же время должны быть точными. 'tmpTheta1 = theta (1) - alpha * (1/m) * ((X * theta) - y) '* X (:, 1); tmpTheta2 = theta (2) - alpha * (1/m) * ((X * theta) - y) '* X (:, 2); ' ' theta (1) = tmpTheta1; ' ' theta (2) = tmpTheta2; ' –