Реализация градиентного спуска в октаве
=======================================

Я на самом деле боролся с этим вот уже как 2 месяца. Что отличает их?

Последний работает. Я просто не знаю, почему ... Я изо всех сил пытаюсь понять необходимость обратной матрицы.

 который вы пропустили, не так ли? Я предполагаю, что вы связали X с вектором единиц.

 Последний пример будет работать, но его можно будет векторизовать еще больше, чтобы он был более простым и эффективным.

 Я предполагаю, что у тебя есть только 1 функция. он будет работать одинаково с несколькими функциями, поскольку все, что происходит, - это добавление дополнительного столбца в матрицу X для каждой функции. В основном вы добавляете вектор единиц к x, чтобы векторизовать перехват.

 Вы можете обновить матрицу 2х1 в одной строке кода. Если x объединить вектор единиц, сделав его матрицей 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 была матрицей 3x2, а тета - матрицей 2x1, то «гипотезы» были бы матрицей 3x1.

 Предполагая, что y является матрицей 3x1, вы можете выполнить (гипотезы - y) и получить матрицу 3x1, а затем транспонировать эту 3x1 в матрицу 1x3, назначенную для temp.

 Тогда матрица 1x3 установлена в theta (2), но это не должно быть матрицей.

 Последние две строки вашего кода работают, потому что, используя мои примеры mxn выше,

 будет матрицей 3х1.

 Затем матрица 3x1 вычитается из y (матрица 3x1), и в результате получается матрица 3x1.

 Так что транспонирование матрицы 3x1 - это матрица 1x3.

 Наконец, матрица 1x3, умноженная на матрицу 3x1, будет равна скалярной матрице или матрице 1x1, что вы и ищете. Я уверен, что вы уже знали, но, если быть точным, X (:, 2) - это второй столбец матрицы 3x2, что делает ее матрицей 3x1.





 Это проще векторизовать с помощью

Помнить`X`, это матрица дизайна, и поэтому каждая строка`X` представляет обучающий пример и каждый столбец`X` представляет данный компонент (скажем, нулевой или первый компонент) во всех учебных примерах. Каждый столбец`X`оэтому @ - это именно то, что мы хотим умножить поэлементно на`std_err` перед суммированием, чтобы получить соответствующий компонент тета-вектора.