昨天简单的学了一下梯度下降法,今天上手啦hhh
用c++的日子嘤嘤嘤
不过好在今天算出来了,其实真的不难啊,但是需要改进的总有很多。
包括今天很有激情的说:写出来才能吃饭。
写代码时间就过的贼快……
今天,这是一个简单的函数最小值问题
要搞清楚暑假集训目标线性回归,这个一定要会。
问题:
其实按照高数的知识,我的解答过程漏洞很多,甚至是不正确的。但是我想表达出今天最近学习到的梯度下降的方法,所以就结合外挂的图像来做了,不严谨的部分请多多包容!欢迎交流!
#include
#include
using namespace std;
int main() {
double x = 1.2;
double y = x * x*x*x - 3 * (x*x*x) + 2;
double y0 = 0;
double y1 = 4 * x*x*x - 9 * x*x;
double alpha = 0.01;
int i = 0;
while (i<1000) {
y0 = y;
y1 = 4 * x*x*x - 9 * x*x;
x = x - alpha * y1;
y = x * x*x*x - 3 * (x*x*x) + 2;
cout << "[" << i << "]" << y << endl;
if (abs(y - y0) < 0.0000001) {
break;
}
i = i++;
}
cout << i << endl;
cout << x << endl;
cout << y << endl;
system("pause");
return 0;
}
这个原理昨天已经说的很清楚了,用计算机算十分简单,但是小白梨小菜鸡很愚笨,算了一下午。到底是哪里出问题了呢?
最开始我做了一件很错误的事,那就是把x的初始值设定为0。
所以我的导数导一下也是0……就很奔溃为啥不循环。
还有alpha的取值太难把控了!
为什么我的控制台什么都没有显示?
(把每一个变化的x打印出来)
为什么我有这么大的数?
(其实主要是自己参数没调好)
为什么我还是不循环?
(继续换参数)
为什么我还是得不到正确结果?
(可能是surface带不动吧……)
就在代码处,开始我一直设定的while(true),所以结果很难撞上正确的。
现在可以清晰明朗的显示啦:
我开始不会用绝对值的那个函数,所以直接用了小于,以为结果一样。但是我忘了负数也是小于的!
陈睿 16:32:23
#include
#include
using namespace std;
int main() {
double x = 1.2;
double y = x*x*x*x - 3 * (x*x*x) + 2;
double y0 = 0;
double y1 = 4 * x*x*x - 9 * x*x;
double alpha = 1.2;
int i = 0;
while (i<1000) {
y0 = y;
x = x - alpha * y1;
y = x * x*x*x - 3 * (x*x*x) + 2;
cout <<"["<"]"<< y << endl;
if (y - y0 < 0.0000001) {
break;
}
i = i++;
}
cout << i << endl;
cout << x << endl;
cout << y << endl;
system("pause");
return 0;
}