我已经尝试了所有方法,但无法弄清楚为什么我的梯度下降无法正常工作。我看了无数示例,并多次更改了梯度下降代码。当我运行程序时,得到的响应为NaN
。然后,我打印出每个迭代,并发现在到达NaN
之前,该值越来越高(或越来越低至负无穷大)。我尝试了不同的alpha值,开始的beta值,迭代次数以及每一次都不起作用。发生了什么事?
这是我的代码:
A = load('A2-datasets/data-build-stories.mat');
X = [ones(60,1) A.data_build_stories(:,1)];
y = A.data_build_stories(:,2);
b = gradDes(X, y);
function beta = gradDes(X,y)
alpha = 0.01;
beta = [0;0];
m = length(y);
for i = 1:1000
beta = beta - (alpha/m) * (X' * (X * beta - y));
end
end
这是data-build-stories.mat
:
770 54
677 47
428 28
410 38
371 29
504 38
1136 80
695 52
551 45
550 40
568 49
504 33
560 50
512 40
448 31
538 40
410 27
409 31
504 35
777 57
496 31
386 26
530 39
360 25
355 23
1250 102
802 72
741 57
739 54
650 56
592 45
577 42
500 36
469 30
320 22
441 31
845 52
435 29
435 34
375 20
364 33
340 18
375 23
450 30
529 38
412 31
722 62
574 48
498 29
493 40
379 30
579 42
458 36
454 33
952 72
784 57
476 34
453 46
440 30
428 21
答案 0 :(得分:0)
您正在使用一个 对于您的数据而言,alpha太大。
尝试更改它:
A = load('tmp.txt');
X = [ones(60,1) A(:,1)];
y = A(:,2);
b = gradDes(X, y);
function beta = gradDes(X,y)
alpha = 0.00000001;
beta = [0;0];
m = length(y);
for i = 1:1000
beta = beta - (alpha/m) * (X' * (X * beta - y));
end
end
b =[ 0.0001 0.0719]