2017-05-24 3 views
1

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 ?

+1

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. –

+0

@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? –

+1

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. –

Antwort

1

Ihr Problem ergibt sich aus den Dimensionen Ihrer Werte. Ihre Werte steigen stetig bis auf 5.e+304 und im darauf folgenden Zeitschritt wird ein Fehler gemeldet, der wahrscheinlich von einem Überlauf herrührt.

können Sie die Grenzwerte überprüfen numpy.float64 Werte mit:

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

Wie Sie der Maximalwert um 1.8e+308 zu sehen. Eine Lösung für dieses Problem besteht darin, die Werte zu verkleinern.

Verwandte Themen