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
私はこのエラーをソートする方法を知っていると可能性があり?
あなたの値は 'numpy.float64'の最大値に非常に近いです。 'numpy.finfo( 'd')'をチェックすると、最大値は '1.8e + 308'になります。反復76でのあなたの値は、すでに「5.0e + 304」にあり、次のステップで最大値を超えて増加することがあります。 –
@ChristophEngwerデータセットに属する値を変更せずにソートする方法はありますか?代わりに**フィーチャスケーリング**を使うべきですか? –
私はダイレクトプリントで、すなわち文字列フォーマットではなく、時間ステップごとに「コスト」の値をチェックします。値が '1.8e + 308'より大きい場合は、実際の値の代わりにnumpy.infを与えます。このような場合は、おそらく値を縮小する必要があります。 –