2016-09-29 12 views
3

私はpythonで勾配降下を実装しようとしています。私の損失/コストはすべての反復で増加し続けます。Pythonの勾配降下 - コストが増加し続ける

私は少数の人々がこれについて投稿見られ、ここで答えを見てきました:私は私の実装が似ていると信じてgradient descent using python and numpy

を、私は爆発コスト値を取得するために間違ってやっているかを見るカント:

Iteration: 1 | Cost: 697361.660000 
Iteration: 2 | Cost: 42325117406694536.000000 
Iteration: 3 | Cost: 2582619233752172973298548736.000000 
Iteration: 4 | Cost: 157587870187822131053636619678439702528.000000 
Iteration: 5 | Cost: 9615794890267613993157742129590663647488278265856.000000 
私は私がオンラインで見つけるデータセット(LAハートデータ)上でこれをテストしてい

http://www.umass.edu/statdata/statdata/stat-corr.html

インポートコード:

dataset = np.genfromtxt('heart.csv', delimiter=",") 

x = dataset[:] 
x = np.insert(x,0,1,axis=1) # Add 1's for bias 
y = dataset[:,6] 
y = np.reshape(y, (y.shape[0],1)) 

勾配降下:

def gradientDescent(weights, X, Y, iterations = 1000, alpha = 0.01): 
    theta = weights 
    m = Y.shape[0] 
    cost_history = [] 

    for i in xrange(iterations): 
     residuals, cost = calculateCost(theta, X, Y) 
     gradient = (float(1)/m) * np.dot(residuals.T, X).T 
     theta = theta - (alpha * gradient) 

     # Store the cost for this iteration 
     cost_history.append(cost) 
     print "Iteration: %d | Cost: %f" % (i+1, cost) 

計算コスト:

def calculateCost(weights, X, Y): 
    m = Y.shape[0] 
    residuals = h(weights, X) - Y 
    squared_error = np.dot(residuals.T, residuals) 

    return residuals, float(1)/(2*m) * squared_error 

計算仮説:

def h(weights, X): 
    return np.dot(X, weights) 

実際にそれを実行するには:

gradientDescent(np.ones((x.shape[1],1)), x, y, 5) 
+0

間違った方向に向いているように思えるので、私のベスト・ベットは簡単な署名の問題です。 –

答えて

3

グラデーションの派生が正しいと仮定すると、あなたは=-を使用していて、あなたは-=を使用しているはずです。代わりにthetaを更新する、あなたは- (alpha * gradient)

EDIT(上記の問題は、コードで修正された後)にそれを再割り当てされています

私は私が信じるもののコードが正しいデータセットが何であるかを実行し、取得することができましたalpha=1e-7を設定することによって動作するコスト。 1e6の繰り返しで実行すると、収束しているはずです。このデータセットに対するこのアプローチは、学習率に非常に敏感です。

+0

スタックオーバーフローを起こすと、それが私の小さな誤植だったと思います。私はそのコードを 'theta = theta - (alpha * gradient)'に置き換えることによってコードをより明示的にしました。そして私はまだ同じ問題を抱えています – Simon

1

一般的に、あなたのコストが増加している場合は、最初に確認する必要がありますあなたの学習率が大きすぎるかどうかを確認することです。このような場合、コスト関数は最適な値を超えてジャンプし、無限大に増加します。学習率の異なる小さな値を試してみてください。あなたが説明する問題に直面するとき、私は通常、J(w)が減少する速度を見つけるまで、学習率の1/10を繰り返し試します。

別の問題は、派生した実装のバグかもしれません。デバッグの良い方法は、グラジエントチェックを行い、アナリティックグラデーションと数値グラデーションを比較することです。

関連する問題