2017-05-24 15 views
1

scikit-learnライブラリを使用して取得したload_bostonというおもちゃデータセットで、バッチグラジェント降下を現在実行しようとしています。データセットのディメンションは、506 x 13であり、100のオーダーのデータで構成されています。以下は私のPythonスクリプトです。それに続くのはスクリプトの実行時の私のエラーです。Pythonで非常に大きな値を扱う/表示する

boston_data_regression.py

import scipy 
import numpy 

from sklearn.datasets import load_boston 

def generateGradient (X, Y, m, alpha, theta, num_iterations) : 

    X_transpose = X.transpose() 

    for i in range(0, num_iterations) : 
     hypothesis = numpy.dot(X, theta) 
     delta = hypothesis - Y 
     cost = numpy.sum(delta ** 2)/(2 * m) 

     print ("No. iteration : %d | Cost : %ld" % ((i + 1), cost)) 

     gradient = numpy.dot(X_transpose, delta)/m 
     theta = theta - alpha * gradient 

    return (theta) 

if __name__ == '__main__' : 

    boston_data = load_boston() 
    X = boston_data.data[:, 0:11] 
    Y = boston_data.data[:,12] 

    print (boston_data.data) 

    print (numpy.shape(X)) 
    print (numpy.shape(Y)) 

    num_iterations = 100000 
    alpha = 0.0005 
    m, n = numpy.shape(X) 

    theta = numpy.ones(n) 
    theta = generateGradient(X, Y, m, alpha, theta, num_iterations) 

    print (theta) 

エラー:バッチ勾配降下を実行するより良い/より最適化された方法があるかどう

No. iteration : 75 | Cost : 5107568749643583921695342267251134617186569132604666005559083886757991071451800270203896531093730395389956630990780914914913406418422174358389131741568461360913005557192743665544540413282512755425657295941969706284629047517505070375172805106443882740219842668724638239205198801815953626988648840822784 
No. iteration : 76 | Cost : 50304231336916560424319335120140228744355885776376593114754676052001428477104842266241766923801372402675185672996149747402542290566577918714034301765248577735574592772115140169849029676464020678156657455729204985429508262045621361912203426365153327346440580108502094724090338985744326599309593512431845376 
boston_data_regression.py:13: RuntimeWarning: overflow encountered in square 
    cost = numpy.sum(delta ** 2)/(2 * m) 
Traceback (most recent call last): 
    File "boston_data_regression.py", line 38, in <module> 
    theta = generateGradient(X, Y, m, alpha, theta, num_iterations) 
    File "boston_data_regression.py", line 15, in generateGradient 
    print ("No. iteration : %d | Cost : %ld" % ((i + 1), cost)) 
TypeError: %d format: a number is required, not numpy.float64 

私はこのエラーをソートする方法を知っていると可能性があり?

+1

あなたの値は 'numpy.float64'の最大値に非常に近いです。 'numpy.finfo( 'd')'をチェックすると、最大値は '1.8e + 308'になります。反復76でのあなたの値は、すでに「5.0e + 304」にあり、次のステップで最大値を超えて増加することがあります。 –

+0

@ChristophEngwerデータセットに属する値を変更せずにソートする方法はありますか?代わりに**フィーチャスケーリング**を使うべきですか? –

+1

私はダイレクトプリントで、すなわち文字列フォーマットではなく、時間ステップごとに「コスト」の値をチェックします。値が '1.8e + 308'より大きい場合は、実際の値の代わりにnumpy.infを与えます。このような場合は、おそらく値を縮小する必要があります。 –

答えて

1

問題は、値の次元から発生します。あなたの値は5.e+304まで順調に増加し、後続のタイムステップでエラーが発生します。おそらくオーバーフローが原因です。

あなたがしてnumpy.float64値の制限を確認することができます:あなたが見ることができるように、最大​​値は約1.8e+308

import numpy 
numpy.finfo('d') 
finfo(resolution=1e-15, min=-1.7976931348623157e+308, max=1.7976931348623157e+308, dtype=float64) 

です。この問題の解決策は、値を縮小することです。

関連する問題