梯度下降算法不会收敛

how*_*rdh 8 c++ machine-learning linear-regression

我正在尝试为斯坦福机器学习讲座(讲座2大约25:00)中解释的梯度下降算法编写一些代码.下面是我最初使用的实现,我认为它已经从讲座中正确复制了,但是当我>8向训练集添加大数字()时它并没有收敛.

我正在输入一个数字X,并且point (X,X)被添加到训练集中,所以此刻,我只是想让它收敛到y=ax+b哪里a=1=theta\[1\]b=0=theta\[0\].训练集是数组xy,其中(x[i],y[i])是一个点.

void train()
{
    double delta;
    for (int i = 0; i < x.size(); i++)
    {
        delta = y[i]-hypothesis(x[i]);
        theta[1] += alpha*delta*x[i];
        theta[0] += alpha*delta*1;
    }
}

void C_Approx::display()
{
    std::cout<<theta[1]<<"x + "<<theta[0]<<" \t "<<"f(x)="<<hypothesis(1)<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我得到的一些结果:我输入一个数字,然后运行train()几次display()

1
0.33616x + 0.33616   f(x)=0.67232
1
0.482408x + 0.482408     f(x)=0.964816
1
0.499381x + 0.499381     f(x)=0.998762
1
0.499993x + 0.499993     f(x)=0.999986
1
0.5x + 0.5   f(x)=1
Run Code Online (Sandbox Code Playgroud)

它通过后的一个例子8:

1
0.33616x + 0.33616   f(x)=0.67232
2
0.705508x + 0.509914     f(x)=1.21542
3
0.850024x + 0.449928     f(x)=1.29995
4
0.936062x + 0.330346     f(x)=1.26641
5
0.951346x + 0.231295     f(x)=1.18264
6
0.992876x + 0.137739     f(x)=1.13062
7
0.932206x + 0.127372     f(x)=1.05958
8
1.00077x + 0.000493063   f(x)=1.00126
9
-0.689325x + -0.0714712      f(x)=-0.760797
10
4.10321e+08x + 4.365e+07     f(x)=4.53971e+08
11
1.79968e+22x + 1.61125e+21   f(x)=1.9608e+22
12
-3.9452e+41x + -3.26957e+40      f(x)=-4.27216e+41
Run Code Online (Sandbox Code Playgroud)

我尝试了这里提出的扩展步骤的解决方案,最终得到了类似的结果.我究竟做错了什么?

Don*_*eba 9

你的实施很好.通常,当α太大时,随机梯度下降可能会发散.使用大型数据集时,您需要采用合理大小的随机样本,找到能够获得最佳结果的α,然后将其用于其余部分.