スタンフォード機械学習講義(lecture 2 at around 25:00)で説明した勾配降下アルゴリズムのコードを少し書いてみようとしています。以下は私が最初に使った実装ですが、講義から正しくコピーされていると思いますが、大きな数字(>8
)をトレーニングセットに追加すると収束しません。勾配降下アルゴリズムが収束しない
私は数X
を入力していて、現時点では、私はそれだけがy=ax+b
どこa=1=theta\[1\]
とb=0=theta\[0\]
に収束するために取得しようとしているのでpoint (X,X)
は、訓練セットに追加されます。 トレーニングセットは配列x
とy
です。(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;
}
私は取得していた結果の一部
: : I入力数は、それがその後、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
それは8
を通過した後、それが発散の例train()
数回、実行します
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
解決策を試して、ステップをスケーリングするhereを試み、同様の結果に終わった。 私は何が間違っていますか?
ランダムサンプルに基づいてどのようにαを決定しますか? – howardh
@howardh、単純に異なる値を試し、小さなJ(θ)にすばやく収束するものを選択するだけです。 –
元のトレーニングセットから無作為に選択した新しいデータセットを作成し、そのセットをあるαで呼び出してtrain()を呼び出し、エラーがすべてのステップで減少しない場合は、αとrepeatを減らしますか? – howardh