Функция стоимости, линейная регрессия, пытаясь избежать жесткого кодирования тета. Октав.
Я нахожусь на второй неделе курса машинного обучения профессора Эндрю Нг через 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 внутри этой функции?
Если вам нужна дополнительная информация, чтобы понять, что я пытаюсь спросить, я постараюсь изо всех сил предоставить ее.
Ответы
Ответ 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