Подтвердить что ты не робот

Функция стоимости, линейная регрессия, пытаясь избежать жесткого кодирования тета. Октав.

Я нахожусь на второй неделе курса машинного обучения профессора Эндрю Нг через Coursera. Мы работаем над линейной регрессией, и сейчас я имею дело с кодированием функции стоимости.

Код, который я написал, правильно решает проблему, но не передает процесс отправки и не выполняет unit test, потому что я жестко закодировал значения theta и не допускал более двух значений для theta.

Вот код, который у меня до сих пор

function J = computeCost(X, y, theta)

m = length(y);
J = 0;

for i = 1:m,
    h = theta(1) + theta(2) * X(i)
    a = h - y(i);
    b = a^2;
    J = J + b;
    end;
J = J * (1 / (2 * m));

end

unit test есть

computeCost( [1 2 3; 1 3 4; 1 4 5; 1 5 6], [7;6;5;4], [0.1;0.2;0.3])

и должен производить ans = 7.0175

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

Может ли кто-нибудь предложить способ, которым я могу разрешить любое количество значений для theta внутри этой функции?

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

4b9b3361

Ответ 1

Вы можете использовать векторизация операций в Octave/Matlab. Итерации по всему вектору - это действительно плохая идея, если ваш язык программирования позволяет вам векторизовать операции. R, Octave, Matlab, Python (numpy) позволяют эту операцию. Например, вы можете получить скалярное производство, если тета = (t0, t1, t2, t3) и X = (x0, x1, x2, x3) следующим образом: theta * X '= (t0, t1, t2, t3) * (x0, x1, x2, x3)' = t0 * x0 + t1 * x1 + t2 * x2 + t3 * x3 Результат будет скалярным.

Например, вы можете векторизовать h в коде следующим образом:

H = (theta'*X')';
S = sum((H - y) .^ 2);
J = S / (2*m);

Ответ 2

Выше ответ прекрасен, но вы также можете сделать

H = (X*theta);
S = sum((H - y) .^ 2);
J = S / (2*m);

Вместо вычисления

(theta' * X')'

а затем с помощью транспонирования вы можете напрямую вычислить

(X * theta)

Он отлично работает.

Ответ 3

Следующая строка возвращает требуемое значение стоимости 32,07, пока мы запускаем computeCost один раз, используя θ, инициализированный нулями:

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

и похож на оригинальные формулы, которые приведены ниже.

enter image description here

Ответ 4

Это можно сделать также в строке- m- # тренировочные комплекты

J=(1/(2*m)) * ((((X * theta) - y).^2)'* ones(m,1));

Ответ 5

J = sum(((X*theta)-y).^2)/(2*m);
ans =  32.073

Выше ответ прекрасен, я думал, что проблема глубоко в течение дня и до сих пор не знакома с Октавом, так что просто изучайте вместе!

Ответ 6

Если вы хотите использовать только матрицу, так:

temp = (X * theta - y);        % h(x) - y
J = ((temp')*temp)/(2 * m);
clear temp;

Ответ 7

function J = computeCost(X, y, theta)

m = length(y);

J = 0;

% Hypothesis h(x)
h = X * theta;

% Error function (h(x) - y) ^ 2
squaredError = (h-y).^2;

% Cost function
J = sum(squaredError)/(2*m);

end

Ответ 8

Я думаю, что нам нужно было использовать итерацию для более общего решения для стоимости, а не для одной итерации, также результат, показанный в PDF 32.07, может быть неправильным ответом на то, что грейдер ищет причину, являющуюся одним из многих данных обучения.

Я думаю, что он должен проходить так, как этот

  for i in 1:iteration
  theta = theta - alpha*(1/m)(theta'*x-y)*x

  j = (1/(2*m))(theta'*x-y)^2