matlab - 梯度下降总是趋于无穷
问题描述
我已经尝试了所有方法,但无法弄清楚为什么我的梯度下降不起作用。我查看了许多示例,并多次更改了梯度下降代码。当我运行程序时,我得到一个响应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
解决方案
您正在迭代梯度下降,而 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]
推荐阅读
- docker - 在mac osx上通过`-it`命令拉取镜像后如何进入docker容器?
- python - 如何更改 Python GTK3 SpinButton 显示文本的格式?
- python - Python 在 .csv 文件中“查找/替换”字符串,出现回溯名称错误
- forms - 如何禁用谷歌表单上的粘贴?
- python - How do I use regular expression to list words that start with vowels in a sentence
- c++ - 用于平铺矩阵乘法的 AVX 内在函数
- angular - angular 9 添加构造函数参数,然后 html 渲染不正确
- javascript - useState 不适用于数组,React Hooks
- python - ndarray中列的计算问题
- ram - 如何构建一个带有 1 个数据寄存器和一个 U 总线的 16 位 RAM?(使用 Logisim)