Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有人能看一下简单的梯度下降代码吗?_C++_Machine Learning_Artificial Intelligence - Fatal编程技术网

C++ 有人能看一下简单的梯度下降代码吗?

C++ 有人能看一下简单的梯度下降代码吗?,c++,machine-learning,artificial-intelligence,C++,Machine Learning,Artificial Intelligence,我试图实现一个非常简单的一维梯度下降算法。我的代码根本不起作用。基本上取决于我的alpha值,end参数要么非常大(比如~70位),要么基本为零(~0.000)。我觉得梯度下降在alpha中不应该如此敏感(我在[0.0,1.0]中生成小数据,但我认为梯度本身应该考虑数据的规模,不是吗?) 代码如下: #include <cstdio> #include <cstdlib> #include <ctime> #include <vector> us

我试图实现一个非常简单的一维梯度下降算法。我的代码根本不起作用。基本上取决于我的alpha值,end参数要么非常大(比如~70位),要么基本为零(~0.000)。我觉得梯度下降在alpha中不应该如此敏感(我在[0.0,1.0]中生成小数据,但我认为梯度本身应该考虑数据的规模,不是吗?)

代码如下:

#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <vector>

using namespace std;

double a, b;
double theta0 = 0.0, theta1 = 0.0;

double myrand() {
  return double(rand()) / RAND_MAX;
}

double f(double x) {
  double y = a * x + b;
  y *= 0.1 * (myrand() - 0.5);  // +/- 5% noise

  return y;
}

double h(double x) {
  return theta1 * x + theta0;
}

int main() {
  srand(time(NULL));
  a = myrand();
  b = myrand();

  printf("set parameters: a = %lf, b = %lf\n", a, b);

  int N = 100;

  vector<double> xs(N);
  vector<double> ys(N);
  for (int i = 0; i < N; ++i) {
    xs[i] = myrand();
    ys[i] = f(xs[i]);
  }

  double sensitivity = 0.008;
  double d0, d1;

  for (int n = 0; n < 100; ++n) {
    d0 = d1 = 0.0;
    for (int i = 0; i < N; ++i) {
      d0 += h(xs[i]) - ys[i];
      d1 += (h(xs[i]) - ys[i]) * xs[i];
    }

    theta0 -= sensitivity * d0;
    theta1 -= sensitivity * d1;

    printf("theta0: %lf, theta1: %lf\n", theta0, theta1);
  }

  return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
双a,b;
双θ0=0.0,θ1=0.0;
双myrand(){
返回双精度(rand())/rand_MAX;
}
双f(双x){
双y=a*x+b;
y*=0.1*(myrand()-0.5);//+/-5%噪声
返回y;
}
双h(双x){
返回θ1*x+θ0;
}
int main(){
srand(时间(空));
a=myrand();
b=myrand();
printf(“设置参数:a=%lf,b=%lf\n”,a,b);
int N=100;
向量xs(N);
向量ys(N);
对于(int i=0;i
更改alpha的值会导致算法发散,因此这可能是发生这种情况的原因之一。您可以通过计算每次迭代中的误差来进行检查,并查看误差是增大还是减小

此外,建议在开始时随机设置θ值,而不是将其指定为零

除此之外,更新θ值时,应除以N,如下所示:

θ0-=灵敏度*d0/N


θ1-=灵敏度*d1/N

我快速查看了您的实现,我觉得它很好

我的代码根本不起作用

我不会那么说。对于足够小的
灵敏度值
,它的行为似乎是正确的,这是一个您只需“猜测”的值,这就是梯度下降的工作原理

我觉得梯度下降在阿尔法中不应该如此敏感


如果你很难想象这一点,请记住,你正在使用梯度下降法来寻找线性回归的成本函数的最小值,这是一个二次函数。如果你画出代价函数,你就会明白为什么学习率在这些情况下是如此敏感:直觉上,如果抛物线很窄,算法会收敛得更快,这是好的,但是学习率更“敏感”,如果你不小心,算法很容易发散。

就我所见,你的函数“f”是一个随机函数,但你的梯度不一定对应于这个函数。如果梯度没有很好地定义,那么下降就不能保证转换。我错过什么了吗?没关系。。。刚刚意识到这是一个随机噪声啊,
f
只是用来生成训练数据
h
是我执行下降的函数。您可以在这里参考开源实现:使用工作的GD算法和线性模型,不需要随机初始化参数。这只会让事情变得更复杂。