梯度下降总是会趋向于无穷大

3
我已经尝试了一切,但无法弄清楚为什么我的梯度下降不起作用。我查看了许多示例,并多次更改了梯度下降代码。当我运行程序时,我得到一个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  

你的梯度线看起来正确。你能发布data-build-stories.mat文件吗? - rsaxvc
@rsaxvc 我已经将它添加到原始帖子中。 - Jeff Rohlman
1个回答

3
您正在使用过大的alpha值迭代梯度下降算法。建议您尝试更改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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接