我正在尝试用 C++ 编写一个简单的梯度下降算法(迭代 10,000 次)。这是我的程序:
#include<iostream>
#include<cmath>
using namespace std;
int main(){
double learnrate=10;
double x=10.0; //initial start value
for(int h=1; h<=10000; h++){
x=x-learnrate*(2*x + 100*cos(100*x));
}
cout<<"The minimum is at y = "<<x*x + sin(100*x)<<" and at x = "<<x;
return 0;
}
输出最终为:y=nan 和 x=nan。我尝试通过将 x 和 y 的值放入文件中来查看它们,经过一定数量的迭代后,我得到了所有 nans(对于 x 和 y)。编辑:我选择学习率(或步长)为 10 作为实验,之后我将使用更小的值。
最佳答案
一定是你的公式有问题。 x 的前 10 个值已经像 hell 一样增加:
-752.379
15290.7
-290852
5.52555e+06
-1.04984e+08
1.9947e+09
-3.78994e+10
7.20088e+11
-1.36817e+13
2.59952e+14
无论您选择什么起始值,下一个x
的绝对值都会更大。
|next_x| = | x - 20 * x - 100 * cos(100*x) |
例如,考虑当您选择一个非常小的起始值 (|x|->0
) 时会发生什么,然后
|next_x| = | 0 - 20 * 0 - 100 * cos ( 0 ) | = 100
关于c++ - 为什么我总是得到 Nan 作为输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46496271/