4

Я работаю над линейной регрессией с двумерными данными, но я не могу получить правильные веса для линии регрессии. Возможно, возникла проблема со следующим кодом, потому что рассчитанные весы для линии регрессии рассчитаны не так, как . Использование слишком больших значений данных, около 80000 для x, приводит к NaN для весов. Масштабирование данных от 0 до 1 приводит к неправильным весам, потому что линия регрессии не соответствует данным.неправильных весов с использованием пакетного градиентного спуска в matlab

function [w, epoch_batch, error_batch] = batch_gradient_descent(x, y) 

% number of examples 
q = size(x,1); 

% learning rate 
alpha = 1e-10; 

w0 = rand(1); 
w1 = rand(1); 

curr_error = inf; 
eps = 1e-7; 

epochs = 1e100; 
epoch_batch = 1; 
error_batch = inf; 
for epoch = 1:epochs 
    prev_error = curr_error; 
    curr_error = sum((y - (w1.*x + w0)).^2); 
    w0 = w0 + alpha/q * sum(y - (w1.*x + w0)); 
    w1 = w1 + alpha/q * sum((y - (w1.*x + w0)).*x); 
    if ((abs(prev_error - curr_error) < eps)) 
     epoch_batch = epoch; 
     error_batch = abs(prev_error - curr_error); 
     break; 
    end 
end 

w = [w0, w1]; 

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

данные:

x 
    35680 
    42514 
    15162 
    35298 
    29800 
    40255 
    74532 
    37464 
    31030 
    24843 
    36172 
    39552 
    72545 
    75352 
    18031 

y 
    2217 
    2761 
    990 
    2274 
    1865 
    2606 
    4805 
    2396 
    1993 
    1627 
    2375 
    2560 
    4597 
    4871 
    1119 

Вот код для построения данных:

figure(1) 
% plot data points 
plot(x, y, 'ro'); 
hold on; 
xlabel('x value'); 
ylabel('y value'); 
grid on; 

% x vector from min to max data point 
x = min(x):max(x); 
% calculate y with weights from batch gradient descent 
y = (w(1) + w(2)*x); 
% plot the regression line 
plot(x,y,'r'); 

Веса для немасштабированного набора данных может быть найден с использованием меньшей скорости обучения alpha = 1e-10. Однако при масштабировании данных от 0 до 1 у меня все еще есть проблемы, чтобы получить соответствующие веса.

scaled_x =

0.4735 
0.5642 
0.2012 
0.4684 
0.3955 
0.5342 
0.9891 
0.4972 
0.4118 
0.3297 
0.4800 
0.5249 
0.9627 
1.0000 
0.2393 

scaled_y_en =

0.0294 
0.0366 
0.0131 
0.0302 
0.0248 
0.0346 
0.0638 
0.0318 
0.0264 
0.0216 
0.0315 
0.0340 
0.0610 
0.0646 
0.0149 
+0

Можете ли вы дать некоторые выборочные данные для вызова fucntion? –

+0

Я добавил немасштабированные данные, которые приводят к значениям NaN для весов. Масштабирование от 0 до 1 путем деления максимального значения возвращает неверные веса, которые не соответствуют данным. – evolved

+0

Вы пытаетесь минимизировать функцию? –

ответ

4

Проблема с w1, как вы даете ему слишком большой вес. Вы не должны давать w0 и w1 одинаковый шаг обучения, так как один не умножается на x.

Если я заменяю alpha/q по alpha^4/q (потому что случайный выбор), то она сходится:

enter image description here

+0

Спасибо за вашу помощь! Я изменил w1 = w1 + alpha^4/q * sum ((y - (w1. * X + w0)). * X); используя альфа^4, но это не имеет никакого значения. Еще NaN для весов. – evolved

+0

Что относительно 'alpha/q^2' для случая' w1'? –

+0

@evolved он работает для меня .... Я просто скопировал ваш код, чтобы он работал. oh, 'alpha = 0.001' –