Ich versuche gerade, eine Batch-Gradienten-Abstieg auf einem Spielzeug-Datensatz namens load_boston
mit der scikit-learn
-Bibliothek erhalten durchzuführen. Die Dimesnions des Datensatzes sind 506 x 13 und bestehen aus Daten in der Größenordnung von 100. Unten ist mein Python-Skript und darauf folgen meine Fehler beim Ausführen des Skripts.Handhabung/Anzeige extrem großer Werte in 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)
Fehler:
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
Darf ich wissen, wie man diese Fehler sortieren und wenn es eine bessere/optimierte Art und Weise der Durchführung Batch Gradientenabfallsaktualisierung ?
Ihre Werte liegen ziemlich nah am Maximum von 'numpy.float64'. Wenn Sie 'numpy.finfo ('d')' überprüfen, werden Sie feststellen, dass der Maximalwert um '1.8e + 308' liegt. Ihr Wert bei Iteration 76 liegt bereits bei "5.0e + 304" und kann im nachfolgenden Schritt über den Maximalwert hinaus ansteigen. –
@ChristophEngwer Also gibt es eine Möglichkeit, Dinge zu sortieren, ohne die Werte zu ändern, die zu dem Datensatz gehören, oder sollte ich stattdessen ** Feature-Skalierung ** verwenden? –
Ich würde den Wert für "Kosten" bei jedem Zeitschritt mit einem direkten Druck überprüfen, d. H. Nicht über die Formatierung von Strings. Wenn Ihr Wert höher als "1,8e + 308" ist, erhalten Sie statt des tatsächlichen Werts "numpy.inf". Wenn dies der Fall ist, sollten Sie Ihre Werte wahrscheinlich verkleinern. –