2017-08-10 2 views
0

Ich schreibe ein Python-Programm zum Finden von Bereichen von Interesse auf einer Seite. Die Positionen auf der Seite aller Werte von Interesse werden mir gegeben, aber einige Werte (typischerweise nur ein oder zwei) sind weit weg von den anderen und ich möchte diese entfernen. Der Datensatz ist nicht riesig, weniger als 100 Datenpunkte, aber ich muss dies viele Male tun.Ansatz zum Entfernen von Ausreißern von zweidimensionalen Daten

Ich habe ein kartesisches Koordinatensystem auf zwei Achsen (x und y) im ersten Quadranten, also nur positive Werte.

Meine Datenpunkte stellen Kästchen dar, die in diesem Koordinatensystem gezeichnet wurden und die ich als Satz von zwei Koordinatenpaaren in einem Tupel gespeichert habe. Eine Box kann mit zwei Koordinatenpaaren gezeichnet werden, da alle Linien gerade sind. Beispiel: (8, 2, 15, 10) würde eine Box mit Indizes (x, y) = (8,2), (8,10), (15,10) und (15,2) zeichnen.

Ich versuche, die Ausreißer in diesem Satz zu entfernen, habe aber eine harte Zeit zu versuchen, einen guten Ansatz zu finden. Ich habe darüber nachgedacht, die Ausreißer zu entfernen, indem das IQB zu finden und alle Punkte zu entfernen, die diese Kriterien erfüllen:

Q1 - 1,5 * IQR oder

Q3 + 1.5 * IQR

Das Problem hier ist, dass ich bin es ist schwer herauszufinden, wie die Werte nicht nur Koordinaten sind, sondern Bereiche, wenn du willst. Sie überlappen sich jedoch, so dass sie auch nicht gut in ein Histogramm passen.

Zuerst dachte ich, ich könnte einen Punkt für jeden ganzen Wert, den die Box überspannt, hinzufügen, die Beispielbox würde in diesem Fall 56 Punkte erzeugen. Es scheint mir, als ob diese Lösung ziemlich schlecht ist. Hat jemand alternative Lösungen?

+0

Haben Sie schauen Isolation Forrest? Du kannst scikit-learn überprüfen: http://scikit-learn.org/stable/modules/outlier_detection.html – Y0da

+0

@ Y0da Nicht diese bestimmte Methode, aber ich habe andere maschinelle Lernansätze vorher angeschaut. Die Daten sind nicht so leicht verfügbar, um einen Trainingssatz usw. zu isolieren und zu erstellen, wie ich dies gewünscht hätte. Wenn ich also eine Lösung finden kann, die ML nicht beinhaltet, wäre dies vorzuziehen. – Victoria

+0

Wenn Sie ML nicht wollen, dann müssen Sie sich den Schwellenwert selbst festlegen. Sie können also eine Norm verwenden. Siehe 'scipy.spatial.distance.cdist' https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cdist.html – Y0da

Antwort

0

Hauptsächlich gibt es zwei Ansätze: Entweder Sie fixieren den Schwellenwert oder Sie lassen maschinelles Lernen für Sie schließen. Für das maschinelle Lernen können Sie Isolation Forest verwenden.

Wenn Sie ML nicht wollen, dann müssen Sie sich den Schwellenwert selbst beheben. Sie können also eine Norm verwenden. Es gibt no.linalg.norm(p1 - p2) oder wenn Sie mehr Kontrolle über die Metrik wollen, ist es cdist:

scipy.spatial.distance.cdist(p1, p2) 
Verwandte Themen