Векторизация алгоритма градиентного спуска
я кодирую градиентный спуск в matlab. Для двух функций я получаю шаг обновления:
temp0 = theta(1,1) - (alpha/m)*sum((X*theta-y).*X(:,1)); temp1 = theta(2,1) - (alpha/m)*sum((X*theta-y).*X(:,2)); theta(1,1) = temp0; theta(2,1) = temp1;
однако я хочу векторизовать этот код и иметь возможность применять его к любому числу функций. Для части векторизации это было указано мне что то, что я пытаюсь сделать, это умножение матрицы
theta = theta - (alpha/m) * (X' * (X*theta-y));
это хорошо видно, но когда я попробовал, я понял, что это не работает для градиентного спуска поскольку параметры не обновляются одновременно.
тогда как я могу векторизовать этот код и убедиться, что параметры и обновлены одновременно?
4 ответов
ваша векторизация верна. Я также попробовал оба ваших кода, и это дало мне тот же тета. Просто помните, что не используйте обновленную тэту во второй реализации.
Это также работает, но менее упрощено, чем ваша 2-я реализация:
Error = X * theta - y;
for i = 1:2
S(i) = sum(Error.*X(:,i));
end
theta = theta - alpha * (1/m) * S'
для векторизованной версии попробуйте выполнить следующие действия (два шага для явного одновременного обновления):
gradient = (alpha/m) * X' * (X*theta -y)
theta = theta - gradient
чтобы обновить их одновременно, вам нужно сохранить значение theta (1..n) во временном векторе и после операции просто обновите значения в исходном тета-векторе.
Это код, который я использую для этого:
темп обновления
tempChange = нули (длина (тета), 1);
tempChage = theta - (alpha/m) * (X' * (X*theta-y));
фактическое update
theta = tempChage;