Mit scipy.stats.linregress führe ich eine einfache lineare Regression auf einige Sätze von hochkorrelierten x, y experimentellen Daten durch und untersuche zunächst visuell jedes x, y Streudiagramm für Ausreißer. Allgemeiner (d. H. Programmatisch) gibt es eine Möglichkeit, Ausreißer zu identifizieren und zu maskieren?Kann scipy.stats offensichtliche Ausreißer identifizieren und maskieren?
Antwort
Das statsmodels
Paket hat, was Sie brauchen. Schauen Sie sich diesen kleinen Code-Schnipsel und seine Ausgabe:
# Imports #
import statsmodels.api as smapi
import statsmodels.graphics as smgraphics
# Make data #
x = range(30)
y = [y*10 for y in x]
# Add outlier #
x.insert(6,15)
y.insert(6,220)
# Make graph #
regression = smapi.OLS(x, y).fit()
figure = smgraphics.regressionplots.plot_fit(regression, 0)
# Find outliers #
test = regression.outlier_test()
outliers = ((x[i],y[i]) for i,t in enumerate(test) if t[2] < 0.5)
print 'Outliers: ', list(outliers)
Outliers: [(15, 220)]
bearbeiten
Mit der neueren Version von statsmodels
haben sich die Dinge ein wenig verändert. Hier ist ein neues Code-Snippet, das dieselbe Art der Ausreißererkennung anzeigt.
# Imports #
from random import random
import statsmodels.api as smapi
from statsmodels.formula.api import ols
import statsmodels.graphics as smgraphics
# Make data #
x = range(30)
y = [y*(10+random())+200 for y in x]
# Add outlier #
x.insert(6,15)
y.insert(6,220)
# Make fit #
regression = ols("data ~ x", data=dict(data=y, x=x)).fit()
# Find outliers #
test = regression.outlier_test()
outliers = ((x[i],y[i]) for i,t in enumerate(test.icol(2)) if t < 0.5)
print 'Outliers: ', list(outliers)
# Figure #
figure = smgraphics.regressionplots.plot_fit(regression, 1)
# Add line #
smgraphics.regressionplots.abline_plot(model_results=regression, ax=figure.axes[0])
Outliers: [(15, 220)]
Allgemeiner (d. H. Programmatisch) gibt es eine Möglichkeit, Ausreißer zu identifizieren und zu maskieren?
Verschiedene Ausreißererkennungsalgorithmen existieren; scikit-learn implementiert einige von ihnen.
[Disclaimer:. Ich bin ein Scikit-Learn Mitwirkenden vor]
scipy.stats nichts direkt für Ausreißer, also als Antwort einige Links und Werbung für statsmodels (die eine Statistik Ergänzung für scipy ist .stats)
zur Identifizierung von Ausreißern
http://jpktd.blogspot.ca/2012/01/influence-and-outlier-measures-in.html
http://jpktd.blogspot.ca/2012/01/anscombe-and-diagnostic-statistics.html
statt Maskierung, eine bessere Lösung zu Verwendung ist ein robuster Schätzer
http://statsmodels.sourceforge.net/devel/rlm.html
mit Beispielen, wo leider sind die Grundstücke zur Zeit nicht http://statsmodels.sourceforge.net/devel/examples/generated/tut_ols_rlm.html
RLM angezeigt downweights Ausreißern . Die Schätzergebnisse haben ein weights
Attribut und für Ausreißer sind die Gewichte kleiner als 1. Dies kann auch zum Finden von Ausreißern verwendet werden. RLM
ist auch robuster, wenn es mehrere Ausreißer sind.
Was ist eine exogene Designmatrix? Ich habe einige x, y Daten: y = f (x). Es ist eine meist lineare Funktion: y = mx + b. Wo fange ich mit diesem robusten Schätzer an? Die Terminologie der Dokumente ist für mich undurchdringlich. –
Es ist auch möglich, die Wirkung von Ausreißern zu begrenzen scipy.optimize.least_squares verwenden.Sehen Sie sich speziell den Parameter f_scale
an:
Wert des weichen Rands zwischen Inlier- und Ausreißer-Residuen, Standardwert ist 1,0. ... Dieser Parameter hat keine Auswirkung mit Verlust = 'linear', aber für andere Verlustwerte ist es von entscheidender Bedeutung.
auf der Seite vergleichen sie drei verschiedene Funktionen: die normale least_squares
und zwei Methoden, bei denen f_scale
:
res_lsq = least_squares(fun, x0, args=(t_train, y_train))
res_soft_l1 = least_squares(fun, x0, loss='soft_l1', f_scale=0.1, args=(t_train, y_train))
res_log = least_squares(fun, x0, loss='cauchy', f_scale=0.1, args=(t_train, y_train))
Wie man sehen kann, ist die normalen kleinsten Quadrate viel mehr von Daten Ausreißer betroffen, und es kann sich lohnen, mit verschiedenen loss
Funktionen in Kombination mit anderen f_scales
zu spielen. Die möglichen Verlustfunktionen werden (aus der Dokumentation entnommen):
‘linear’ : Gives a standard least-squares problem.
‘soft_l1’: The smooth approximation of l1 (absolute value) loss. Usually a good choice for robust least squares.
‘huber’ : Works similarly to ‘soft_l1’.
‘cauchy’ : Severely weakens outliers influence, but may cause difficulties in optimization process.
‘arctan’ : Limits a maximum loss on a single residual, has properties similar to ‘cauchy’.
Die scipy Kochbuch has a neat tutorial auf robuste nichtlineare Regression.
- 1. Kann scipy.stats nicht verwenden
- 2. scipy.stats Samen?
- 3. Offensichtliche Modulmuster Nachteile
- 4. SAS Logistic - Identifizieren und Entfernen von Ausreißern
- 5. Wie benutze ich scipy.stats Funktion?
- 6. Wie plotst du Ausreißer und Originalserien?
- 7. Matplotlib boxplot ohne Ausreißer
- 8. Wie kann ich dieses offensichtliche Ereignis aus diesem Bild extrahieren?
- 9. Eigen: ein Array maskieren
- 10. Ausreißer aus der Korrelationskoeffizientenberechnung entfernen
- 11. matplotlib: Ausreißer beim Plotten ignorieren
- 12. Passwörter mit Logback maskieren?
- 13. Schneiden oder Maskieren?
- 14. URL in HTML maskieren
- 15. Maskieren von QLineEdit-Text
- 16. Fehler beim Import scipy.stats für Windows 7
- 17. Ausreißer aus einem Graustufenbild entfernen
- 18. Python entfernen Ausreißer von Daten
- 19. Weniger Ausreißer erkannt mit Boxplot
- 20. Ausreißer in einem Datensatz finden
- 21. entfernen Ausreißer aus gruppierten Daten
- 22. Favorit nicht offensichtliche Eigenschaft von Svn?
- 23. Kann jemand dieses Bildformat identifizieren?
- 24. Kann jemand diese Kodierung identifizieren?
- 25. Bin-Zeilen und für jeden Bin berechnen Dispersion und Return-Ausreißer
- 26. Wie kann ich geom_boxplot-Ausreißer mit getippten geom_points "ausrichten"?
- 27. Erstellen von piplot.hist() erste und letzte Bins enthalten Ausreißer
- 28. identifizieren eindeutig gebrochen jpeg wenn jpeginfo und identifizieren nichts falsch
- 29. Absturz beim Maskieren eines Bildes
- 30. Wie kann ich numpy_1.8 durch das Maskieren von numpy_1.10 stoppen?
Danke für das Hinzufügen der neuen Info! Großartige Beispiele, sie haben mir wirklich geholfen, es zu verstehen. –