Как именно работает это простое исчисление функции стоимости градиентного спуска ML с использованием Octave \ MatLab? - PullRequest
0 голосов
/ 13 апреля 2019

Я прохожу курс машинного обучения на Coursera и выполняю следующее упражнение, используя Октава (MatLab должен быть таким же).

Это упражнениесвязанный с вычислением функции стоимости для алгоритма градиентного спуска .

На слайде курса у меня есть, что это функция стоимости, которую я должен реализовать, используя Octave:

Это формула со слайда курса:

enter image description here

Таким образом, J является функцией некоторых переменных THETA, представленных матрицей THETA (в предыдущемвторое уравнение).

Это правильная реализация MatLab \ Octave для вычисления J (THETA):

function J = computeCost(X, y, theta)
%COMPUTECOST Compute cost for linear regression
%   J = COMPUTECOST(X, y, theta) computes the cost of using theta as the
%   parameter for linear regression to fit the data points in X and y

% Initialize some useful values
m = length(y); % number of training examples

% You need to return the following variables correctly 
J = 0;

% ====================== YOUR CODE HERE ======================
% Instructions: Compute the cost of a particular choice of theta
%               You should set J to the cost.

J = (1/(2*m))*sum(((X*theta) - y).^2)

% =========================================================================

end

где:

X представляет собой матрицу из 2 столбцов из m строк, в которой для всех элементов первого столбца установлено значение 1 :

X =

1.0000    6.1101
1.0000    5.5277
1.0000    8.5186
......    ......
......    ......
......    ......

y является вектором m элементов (как X ):

y =

   17.59200
    9.13020
   13.66200
   ........
   ........
   ........

Finnally theta представляет собой вектор из 2 столбцов, имеющий 0 значений вроде этого:

theta = zeros(2, 1); % initialize fitting parameters
theta
theta =

   0
   0

Хорошо, возвращаясь к моему рабочему решению:

J = (1/(2*m))*sum(((X*theta) - y).^2)

специально для этого умножения матрицы (умножение между матрицами X и вектор theta ): я знаю, что это допустимое матричное умножение, поскольку номер столбца X (2 столбца) равен числу строк theta (2 строки), так что это совершенно правильное умножение матриц.

Мое сомнение, которое сводит меня с ума (вероятно, это тривиальное сомнение), связано с предыдущим контекстом слайда курса:

enter image description here

Как видно из второго уравнения, используемого для вычисления текущего значения h_theta (x) , оно использует транспонированный тета-вектор , а не тета-вектор, как это сделано в коде.

Почему?!?!

Я подозреваю, что это зависит только от того, как был создан тета вектор.Он был построен следующим образом:

theta = zeros(2, 1); % initialize fitting parameters

, который генерирует вектор столбца из двух строк 1 вместо классического вектора столбца из одной строки 2.Так что, возможно, я не должен переносить это.Но я абсолютно не уверен в этом утверждении.

Правильна ли моя интуиция или чего мне не хватает?

1 Ответ

1 голос
/ 13 апреля 2019

Ваша интуиция верна. Фактически, не имеет значения, выполняете ли вы умножение как theta.' * X или как X.' * theta, поскольку при этом создается либо горизонтальный вектор, либо вертикальный вектор гипотезы, представляющей все наблюдения, и что вы ожидаете делать дальше, вычитать y вектор из вектора гипотезы при каждом наблюдении и суммируйте результаты. Поэтому, если y имеет ту же ориентацию, что и ваша гипотеза, и вы вычитаете в каждой эквивалентной точке, то скалярный конечный результат суммирования будет одинаковым.

Достаточно часто вы увидите, что X.' * theta версия предпочтительнее, чем theta.' * X, просто для удобства, чтобы избежать повторного переноса, просто чтобы соответствовать математической записи. Но это нормально, так как математика не меняется, только порядок эквивалентных операций.

Я согласен, что это сбивает с толку, хотя и потому, что усложняет следование формуле, когда код фактически выглядит так, как будто он делает что-то другое, а также потому, что он смешивается с обычным соглашением о том, что вертикальный вектор представляет «координаты», и горизонтальный вектор представляет наблюдения. В таких случаях, особенно в таких языках, как matlab / octave, где ориентация вектора не определена явно в типе переменной, вдвойне важно задокументировать то, что вы ожидаете, что входные данные будут представлять, и, предпочтительно, должно было быть assert операторы в коде, подтверждающие ввод, были переданы в правильной ориентации. Здесь ясно, что они чувствовали, что в этом нет необходимости, поскольку этот код в любом случае действует в контролируемых условиях в заранее определенной среде для тренировок, но было бы неплохо сделать это с точки зрения разработки программного обеспечения.

...