2015-04-11 5 views
-2

Я решаю назначение программирования в курсе Machine Learning. В который я реализовать Gradient Descent Algorithm, как показано нижеРеализация «Алгоритм спуска градиента» в Matlab

enter image description here

Я использую следующий код в Matlab

data = load('ex1data1.txt'); 
% text file conatins 2 values in each row separated by commas 
X = [ones(m, 1), data(:,1)]; 
theta = zeros(2, 1); 
iterations = 1500; 
alpha = 0.01; 

function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters) 
m = length(y); % number of training examples 
J_history = zeros(num_iters, 1); 
for iter = 1:num_iters 
    k=1:m; 
    j1=(1/m)*sum((theta(1)+theta(2).*X(k,2))-y(k)) 
    j2=((1/m)*sum((theta(1)+theta(2).*X(k,2))-y(k)))*(X(k,2)) 
    theta(1)=theta(1)-alpha*(j1); 
    theta(2)=theta(2)-alpha*(j2); 
    J_history(iter) = computeCost(X, y, theta); 
end 
end 

theta = gradientDescent(X, y, theta, alpha, iterations); 

На выполнения кода я получаю сообщение об ошибке

enter image description here

Из сообщения об ошибке видно, что результат приведенного ниже выражения

((1/m)*sum((theta(1)+theta(2).*X(k,2))-y(k)))*(X(k,2)) 

Это вектор, который мы пытаемся сохранить в скалярной переменной j2. Я думаю, что X (k, 2) создает проблему, я использовал ее как индекс для вектора X для извлечения значения из k-й строки и второго столбца. Но, с другой стороны, весь вектор умножается, пожалуйста, предложите мне, как я могу его исправить.

+0

На самом деле, Matlab имеют свои собственные методы для подобных проблем.Я знаю, что не может быть и речи, но стоило сказать:) ... – hyprfrcb

ответ

2

Вы должны научиться читать сообщения об ошибках и следуйте ведет оттуда:

  • Как указано в сообщении об ошибке, количество элементов на левой руке на стороне и право- сторона линии theta(2)=theta(2)-alpha*(j2); не то же самое, поэтому постарайтесь определить, какой именно. Стандартный трюк состоит в том, чтобы сделать disp(size(...)) для всех различных терминов выражения на линии, прежде чем проверять, все ли они имеют размер, который вы ожидаете от них.

  • Некоторые дополнительные аргументы: theta(2) и alpha кажутся скалярами, поэтому, вероятно, это j2, что является нескалярным.

  • Глядя на определение j2, кажется, что sum(...) является скаляром, а окончательное (X(k,2)) является вектором размера (м, 1), так что j2 имеет также размер (м, 1), в то время него вероятно, должен быть скаляром. Вероятно, ошибка состоит в том, что вам нужно включить часть X(k,2) в сумму, чтобы конечный результат был скаляром.

Некоторые другие наблюдения:

  • Вы делаете первый столбец X всех из них, в то время как вы позже использовать только второй столбец. Легче просто использовать x = data(:,1) и использовать это.

  • Вы делаете m=length(y); k=1:m;, а затем используете y(k) несколько раз. Легче всего использовать y сам ...

Вы, вероятно, нужно сделать что-то вроде

theta(1)=theta(1) - alpha/m * sum(whatever - y); 
theta(2)=theta(2) - alpha/m * sum((whatever - y) .* x); 

Вы должны выяснить сами отдохнуть ...

+0

Я знаю смысл сообщения об ошибке. Это происходит потому, что результат j2 хранения не является скалярным значением. Результат операции, которую удерживает j2, должен быть скаляром, но я не смогу найти способ его исправить. Поскольку я новичок в Matlab, у меня есть некоторые проблемы с синтаксисом. – Atinesh

+2

Тогда в чем вопрос? Если вы понимаете сообщение об ошибке, вы должны сказать это, и разработчик ясно, в чем ваша проблема, не оставляйте нас гадать ... –

+0

Мой вопрос в том, в чем проблема с приведенным ниже выражением и как его исправить ((1/m) * сумма ((тета (1) + тета (2) * Х (к, 2).) - у (к))) * (Х (к, 2)). Или есть другой способ реализовать алгоритм. – Atinesh

Смежные вопросы