2017-02-26 14 views
0

多変量線形回帰練習の一環として、Pythonで勾配降下関数を記述しようとしています。それは実行されますが、正解を計算しません。私のコードは以下の通りです。私はこの問題を終えるのに数週間努力してきましたが、進歩はゼロでした。Pythonの勾配降下アルゴリズム

私は、多変量線形回帰関数を最適化するための勾配降下の概念を理解しており、「数学」は正しいと考えています。私はエラーが私のコードにあると信じていますが、私はまだPythonを学んでいます。あなたの助けは非常に高く評価されています。

def regression_gradient_descent(feature_matrix,output,initial_weights,step_size,tolerance): 
    from math import sqrt 
    converged = False 
    weights = np.array(initial_weights) 
    while not converged: 
     predictions = np.dot(feature_matrix,weights) 
     errors = predictions - output 
     gradient_sum_squares = 0 
     for i in range(len(weights)): 
      derivative = -2 * np.dot(errors[i],feature_matrix[i]) 
      gradient_sum_squares = gradient_sum_squares + np.dot(derivative, derivative) 
      weights[i] = weights[i] - step_size * derivative[i] 
     gradient_magnitude = sqrt(gradient_sum_squares) 
     print gradient_magnitude 
     if gradient_magnitude < tolerance: 
      converged = True 
    return(weights) 

機能行列は次のとおりです。

sales = gl.SFrame.read_csv('kc_house_data.csv',column_type_hints = {'bathrooms':float, 'waterfront':int, 'sqft_above':int, 'sqft_living15':float,'grade':int, 'yr_renovated':int, 'price':float, 'bedrooms':float, 'zipcode':str,'long':float, 'sqft_lot15':float, 'sqft_living':float, 'floors':str, 'condition':int,'lat':float, 'date':str, 'sqft_basement':int, 'yr_built':int, 'id':str, 'sqft_lot':int,'view':int}) 

私はとしての機能を呼んでいる:** get_numpy_dataは配列にすべてを変換するだけの機能であり、意図したとおりに動作し

train_data,test_data = sales.random_split(.8,seed=0) 
simple_features = ['sqft_living'] 
my_output= 'price' 
(simple_feature_matrix, output) = get_numpy_data(train_data, simple_features, my_output) 
initial_weights = np.array([-47000., 1.]) 
step_size = 7e-12 
tolerance = 2.5e7  
simple_weights = regression_gradient_descent(simple_feature_matrix, output,initial_weights,step_size,tolerance) 

更新:数式をに修正しました。 0

derivative = 2 * np.dot(errors,feature_matrix) 

と思われます。私のオンラインコースで、この式の導出は

-2 * np.dot(errors,feature_matrix) 

を使用し、私は、この式は正しい答えを提供しなかった理由はわかりません。

+0

実際の出力と予想される出力を含む使用例を与えることはできますか? – mkrieger1

+0

また、あなたのフィーチャマトリックスがどのように見えるかなど、いくつかの入力を提供できる場合は、 – jlarks32

+0

この関数をどのように正確に呼び出すのですか? –

答えて

0

ステップサイズが小さすぎるように思われ、許容値が異常に大きかった。おそらく、あなたはそれらを別の方法で使うことを意味しましたか?一般的に

は、ステップサイズは試行錯誤の手順で決定される:1(例えばまでα=1/2α=1/4などを取って値を下げるために試みることができるように、「自然」のステップサイズα=1は、発散につながる可能性

+0

ありがとう - これらは私のインストラクターによって提供されました。 – LfB

+0

時にはインストラクターが間違っています!ステップサイズは降下の方向に沿ってどのくらい移動するかを決定するので、これを達成するには重要です。一方、許容差は、終了基準を定量化するために使用されます。勾配が0に十分近いか? [私はあなたが関数の勾配が何であるか、なぜそれを0にしようとしているのかを理解していると仮定します。そうでなければ、そのようなアルゴリズムをプログラミングするポイントはあまりありません。だから、少なくともステップサイズ1と許容値= 1e-6を使い、それがどのようになったのかを教えてください。あなたは少なくともいくつかの進歩を見なければなりません。 –

関連する問題