2017-01-10 9 views
2

Я изучаю курс машинного обучения профессора Эндрю Нг на Курсере. Я пытаюсь закодировать функцию стоимости.Функция затрат, в чем разница между суммой (x) и единицами (1, длина (x)) * x?

Это было мое первое решение:

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

Но это не было принято, поэтому я попытался его с суммой:

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

и был принят. Можете ли вы сказать мне, почему? Единственное, что я изменил, это те, и сумма, но результат все тот же.

ответ

5

Нет ничего плохого в этом ответе ... по крайней мере, не изначально. Тем не менее, у вас есть hardcoded вектор ones, чтобы иметь 97 элементов. Что вам нужно сделать, так это обеспечить, чтобы вектор ones был до тех пор, пока есть примеры обучения. 97 элементов не будут работать для вашего набора данных X, если у него не было 97 элементов, поэтому, если вы попытались запустить его в другой форме X, вы получите ошибку несовместимых измерений.

Поэтому использовать общее число элементов m, а затем использовать, чтобы заменить номер 97:

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

Просто, чтобы убедиться, что вы получаете правильный ответ, давайте создадим случайный X, y и theta с 100 примерами обучения и двумя параметрами. Мы будем использовать оба выражения для стоимости и показать, что они производят одинаковую стоимость:

>> rng(123); 
>> X = rand(100, 2); 
>> y = rand(100, 1); 
>> theta = rand(2, 1); 
>> m = size(X, 1); 
>> J = 1/(2 * m) * sum(((X * theta) - y).^2); 
>> J2 = (1/(2*m)) * (ones(1, m) * (((X*theta)-y).^2)); 
>> format long g; 
>> J 

J = 

     0.0702559647930643 

>> J2 

J2 = 

     0.0702559647930643 

слово советы

Вы определили, что найти сумму вектора может быть сделано путем умножения вектора с соответствующим образом заполненным вектором, полным ones. Я бы сказал, что это менее эффективно, и вы можете использовать тот факт, что в этой конкретной функции стоимости вы можете найти точечный продукт между вектором, созданным с помощью X*theta - y. Точечный продукт удобно вычислять по v.' * v, где v является вектором столбца. Это просто матричное умножение, где левая часть оператора умножения является вектором строки, а правая часть оператора умножения является вектором столбца. Я дам вам проверить это самостоятельно, но если вы выясните, что делает эквивалентная операция, это будет точечный продукт.

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

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

Вы также увидите, что вы получите те же результаты:

>> d = X*theta - y; 
>> J = (1/(2*m)) * (d.' * d) 

J = 

     0.0702559647930643