2015-07-09 6 views
41

Ich benutze sklearn und habe Probleme mit der Affinitätspropagation. Ich habe eine Eingabematrix gebaut und bekomme immer den folgenden Fehler .sklearn error ValueError: Der Input enthält NaN, unendlich oder einen zu großen Wert für dtype ('float64')

ValueError: Input contains NaN, infinity or a value too large for dtype('float64'). 

Ich habe

laufen
np.isnan(mat.any()) #and gets False 
np.isfinite(mat.all()) #and gets True 

ich versucht, mit

mat[np.isfinite(mat) == True] = 0 

die unendlichen Werte zu entfernen, aber das hat nicht funktioniert entweder. Was kann ich tun, um die unendlichen Werte in meiner Matrix loszuwerden, damit ich den Affinitätsausbreitungsalgorithmus verwenden kann?

Ich benutze Anaconda und Python 2.7.9.

+1

Ich schließe das, da der Autor selbst sagt, dass seine Daten ungültig waren und obwohl alles darauf hinweist, hat er nicht validiert - die Daten entsprechen einem Tippfehler, der ein abschließender Grund ist. –

+1

Ich hatte das gleiche Problem mit meinem Datensatz. Letztendlich: ein Datenfehler, kein Scikit-Bug. Die meisten Antworten sind hilfreich, aber irreführend. Überprüfen Sie, überprüfen Sie Ihre Daten, stellen Sie sicher, dass bei der Konvertierung in 'float64' ist es sowohl endlich und nicht" nan ". Die Fehlermeldung ist passend - das ist fast sicher das Problem für jeden, der sich hier befindet. – Owen

Antwort

6

Die Dimensionen meines Eingabe-Arrays waren verzerrt, da mein Eingabe-CSV leere Leerzeichen hatte.

39

Dies kann innerhalb von scikit passieren, und es hängt davon ab, was Sie tun. Ich empfehle, die Dokumentation für die Funktionen zu lesen, die Sie verwenden. Sie könnten einen verwenden, der z.B. dass deine Matrix positiv definit ist und diese Kriterien nicht erfüllt.

EDIT: Wie kann ich vermisse, dass:

np.isnan(mat.any()) #and gets False 
np.isfinite(mat.all()) #and gets True 

offensichtlich falsch ist. Rechts wäre:

np.any(np.isnan(mat)) 

und

np.all(np.isfinite(mat)) 

Sie möchten zu überprüfen, wheter jeder des Elements ist NaN, und nicht, ob der Rückgabewert der Funktion any eine Zahl ...

+1

Die Dokumente erwähnen nichts über diesen Fehler Ich brauche eine Möglichkeit, die unendlichen Werte von meinem nupy-Array loszuwerden –

+0

Wie ich schon sagte: Sie sind vielleicht nicht in Ihrem Eingabe-Array. Sie können in der Mathematik auftreten, die zwischen Eingabe und magischer Ausgabe geschieht. Der Punkt ist, dass all diese Mathematik von bestimmten Bedingungen für die Eingabe abhängt. Sie müssen die Dokumente sorgfältig lesen, um herauszufinden, ob Ihre Eingabe diese Bedingungen erfüllt. –

+0

@ MarcusMüller könnten Sie mich auf den Speicherort dieses Dokuments verweisen, wo sie die Anforderungen der Eingabematrix angeben? Ich kann die "Docs", auf die du dich beziehst, nicht finden. Danke :) – user2253546

5

Dies ist die Überprüfung, auf dem es nicht:

Welche sagt

def _assert_all_finite(X): 
    """Like assert_all_finite, but only for ndarray.""" 
    X = np.asanyarray(X) 
    # First try an O(n) time, O(1) space solution for the common case that 
    # everything is finite; fall back to O(n) space np.isfinite to prevent 
    # false positives from overflow in sum method. 
    if (X.dtype.char in np.typecodes['AllFloat'] and not np.isfinite(X.sum()) 
      and not np.isfinite(X).all()): 
     raise ValueError("Input contains NaN, infinity" 
         " or a value too large for %r." % X.dtype) 

So stellen Sie sicher, dass Sie nicht NaN-Werte in Ihrem Eingang haben. Und alle diese Werte sind tatsächlich Float-Werte. Keiner der Werte sollte auch Inf sein.

2

hatte ich den gleichen Fehler, und in meinem Fall X und y waren Datenrahmen, damit ich sie konvertieren musste zuerst Matrizen:

X = X.as_matrix().astype(np.float) 
y = y.as_matrix().astype(np.float) 
+0

diese Lösung funktioniert perfekt für mich! Danke – Gartmair

2

Mit dieser Version von Python 3:

/opt/anaconda3/bin/python --version 
Python 3.6.0 :: Anaconda 4.3.0 (64-bit) 

Betrachtet man die Details des Fehlers, fand ich die Zeilen der Codes, die den Fehler verursachen:

/opt/anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py in _assert_all_finite(X) 
    56    and not np.isfinite(X).all()): 
    57   raise ValueError("Input contains NaN, infinity" 
---> 58       " or a value too large for %r." % X.dtype) 
    59 
    60 

ValueError: Input contains NaN, infinity or a value too large for dtype('float64'). 

Von diesem konnte ich e Xtract die richtige Art und Weise zu testen, was los war mit meinen Daten des gleichen Test mit, die von der Fehlermeldung angegeben ausfällt: np.isfinite(X)

dann mit einer schnellen und schmutzigen Schleife, konnte ich feststellen, dass meine Daten nans tatsächlich enthalten:

print(p[:,0].shape) 
index = 0 
for i in p[:,0]: 
    if not np.isfinite(i): 
     print(index, i) 
    index +=1 

(367340,) 
4454 nan 
6940 nan 
10868 nan 
12753 nan 
14855 nan 
15678 nan 
24954 nan 
30251 nan 
31108 nan 
51455 nan 
59055 nan 
... 

Jetzt alles, was ich tun muss, ist die Werte an diesen Indizes zu entfernen.

1

Dies ist meine Funktion (basierend auf this) den Datensatz von nan, Inf und fehlende Zellen zu reinigen (für schiefe Datensätze):

import pandas as pd 

def clean_dataset(df): 
    assert isinstance(df, pd.DataFrame), "df needs to be a pd.DataFrame" 
    df.dropna(inplace=True) 
    indices_to_keep = ~df.isin([np.nan, np.inf, -np.inf]).any(1) 
    return df[indices_to_keep].astype(np.float64) 
4

ich das gleiche Problem oft begegnet, wenn ich einige Einträge entfernt in meinem df, wie

df = df[df.label=='desired_one'] 

die Lösung ist der Index des df vor dem Ausführen Ihrer sklearn Code zurück:

df = df.reset_index() 
+0

Das löste meinen Fehler. brillant! – Aaron

1

Ich hatte den Fehler, wenn I eine Teilmenge der Zeilen auszuwählen versucht:

df = df.reindex(index=my_index) 

Es stellte sich heraus, dass my_index Werte enthalten, die nicht in df.index enthalten waren, so dass die reindex Funktion einige neue Zeilen und gefülltem eingefügt sie mit nan.

Verwandte Themen