2015-07-29 2 views
3
function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters) 
%GRADIENTDESCENT Performs gradient descent to learn theta 
% theta = GRADIENTDESENT(X, y, theta, alpha, num_iters) updates theta by 
% taking num_iters gradient steps with learning rate alpha 

% Initialize some useful values 
m = length(y); % number of training examples 
J_history = zeros(num_iters, 1); 

for iter = 1:num_iters 

% ====================== YOUR CODE HERE ====================== 
% Instructions: Perform a single gradient step on the parameter vector 
%    theta. 
% 
% Hint: While debugging, it can be useful to print out the values 
%  of the cost function (computeCost) and gradient here. 
% 

    hypothesis = x*theta; 
    theta_0 = theta(1) - alpha(1/m)*sum((hypothesis-y)*x); 
    theta_1 = theta(2) - alpha(1/m)*sum((hypothesis-y)*x); 
    theta(1) = theta_0; 
    theta(2) = theta_1; 








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

% Save the cost J in every iteration  
    J_history(iter) = computeCost(X, y, theta); 

end 

end 

я получаю эту ошибкуиндексы подстрочные должны быть реальными положительными целыми числами или логические выражения

error: gradientDescent: subscript indices must be either positive integers less than 2^31 or logicals 

на этой линии справа в промежутке между первой и тета =

theta_0 = theta(1) - alpha(1/m)*sum((hypothesis-y)*x); 

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

+0

Iter-1 начинается с 1-1 = 0, но октава 1 на основе (начинается с 1) – Sanchises

+0

, даже когда я делаю это все еще дает ошибку – ks4929

+0

Я не думаю, что вам нужно подмножество 'iter' в' theta (iter-1) 'и' X (iter, 2) '? Предыдущая итерация уже хранится в 'theta', и вы меняете' theta' на каждой итерации? – tospig

ответ

2

99% уверены, что ваша ошибка на линии указывала topsig, где у вас есть alpha(1/m)

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

% taking num_iters gradient steps with learning rate alpha

что alpha является константой, а не функция. как таковая, у вас есть линия alpha(1/m) без какого-либо оператора между ними. октава видит это при индексировании alpha со значением 1/m.

то есть, если у вас массив

x = [3 4 5] 
x*(2) = [6 8 10] %% two times each element in the array 
x(2) = [4] %% second element in the array 

, что ты, кажется, не имеет смысла, так как «м = длина (у)», который будет выводить скаляр, так

x = [3 4 5]; m = 3; 
x*(1/m) = x*(1/3) = [1 1.3333 1.6666] %% element/3 
x(1/m) = ___error___ %% the 1/3 element in the array makes no sense 

обратите внимание, что для определенных ошибок всегда указывается, что местоположение ошибки относится к оператору присваивания (знак равенства в начале строки). если он указывает там, вам обычно приходится искать в другом месте строки для фактической ошибки. здесь он кричал на вас, пытаясь применить нецелый индекс (1/m)

+0

Да, я вижу, что случилось, я ожидал, что он пройдет с умножением, используя только скобки вместо знака умножения – ks4929

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