Ausreißer ausmerzen



  • itsamee schrieb:

    Koennen die Ausreißer nur in eine Richtung auftreten, wie in deinem Minibeispiel?

    jaein. lokal betrachtet ja, global nicht.

    Beispiel: (Alle X müssen korrigiert werden)

    ####                     XX
        #####
             ####
                 ##  ####                             ##   ##
                         ####  ####          #########       ####
                                   ##########
    
                   XX
    
                                                        XXX
    

    EDIT: Der verlauf der Rauten verläuft nicht entlang eines Polynoms oder einer bekannten Funktion.

    EDIT 2: Das ist noch ein relativ "nettes / günstiges" Beispiel



  • Hm, also wenn ich dein Bild so sehe, würde ich spontan eine LOWESS regression drauf anwenden. Dadurch werden normalerweilse sämtliche Punkte etwas verschoben (weiß nicht, ob das schlimm ist in deinem Fall), aber ich denke mal, dass es davon auch lokale Varianten gibt, so dass nicht sämtliche Punkte normalisiert werden. Frage ist natürlich, ob es dafür irgendwelche CoffeeScript Bibliotheken gibt, kenne die Sprache nicht.



  • Irgendwie verstehe ich das nicht ganz. Sind das keine diskreten Daten oder warum kannst du nicht einfach

    |f(n) - f(n+1)| > eps
    

    vergleichen?
    (Bzw. wie in deinem Bild mit mehreren x dann |f(n) - f(n+m)|)


  • Mod

    Da bietet sich schon irgendwie einer der fortgeschrittenen Tests an, die ich verlinkt habe. Oder, da es sich ja anscheinend um ein zusammenhängendes Gebilde handelt, etwas wie RANSAC (was auch ein Test auf Ausreißer ist, aber ein bisschen spezieller für zusammenhängende Mengen). Wenn du aber ernsthaft Zeitprobleme bei den einfachen Methoden hast, dann kommt so etwas gar nicht in Frage. Du solltest darüber nachdenken, die Rechnung extern in einer anderen Sprache zu programmieren und dann von deinem Script aus bloß aufzurufen.



  • Im Prinzip brauchst du lokal einen Tiefpass, also im einfachsten Fall einen gleitenden Mittelwert. Und den Tiefpasswert ziehst du eben vom Funktionswert ab.
    Oder eigentlich einen Hochpass. Dort wo der viel durchlässt hast hohe Frequenzen die oft mit Störungen einhergehen.

    Wenn du mehr Infos zum Signal gibst, kann man dir eher helfen. Gerade in der Bildverarbeitung gäbe es spezielle Methoden die hilfreich sein könnten. Im Audiobereich gibts auch diverses.



  • Ich update hier nochmal, weil ich glaube ich habe ein Weg gefunden auch ohne das auszukommen.

    Die Aufgabe liegt darin Graphen wie sowas hier (das ist schon ein relativ harter Fall):
    http://upload.wikimedia.org/wikipedia/commons/d/de/Fitted_line.svg
    zu analysieren und aus dem Bild auf die Werte zu kommen.
    Bei echten Daten sind neben der Regression auch oft noch die Werte als Punkte dargestellt im Koordinatensytem oder gar andere Graphen oder Schmutz.

    Der Analysealgorithmus benötigt einen markierten Bereich im Bild (die Kurve anpinseln) und die Pixeldaten. Daraus erstellt dieser dann, mittels Median, Punkte die "ungefähr" auf der Gerade liegen. Messpunkte die sich außerdem im Bild befinden verursachen offensichtliche Sprungstellen (wenn man sie mit anpinselt).

    Mein jetzt aktueller Ansatz ist diese Sprungstellen zu finden und auf Grund der Sprungrichtung und Verteilung der Punkte zwischen den Sprungstellen auf die tatsächliche Kurve zurückzuschließen. Das ist einfacher als die Ausreißer zu finden. (EDIT: pen und paper tests zeigen gute Ergebnisse)

    Das habe ich alles so einfach wie möglich gehalten weil mathematische Kanonen einfach nur alles verlangsamen.
    Ganz zu Beginn habe ich den sämtlichen markierten Bereich in eine Matrix gefasst und diese manipuliert und mit gerechnet und Verfahren angwandt die mit jeder Iteration bessere Ergebnisse liefern. Das Ergebnis war gut in der Theorie aber Praktisch viel zu langsam.



  • @5cript: Ich habe mir die Methoden aus dem Wikipedia-Artikel nicht angeguckt, aber ich würde da einfach mit einem Schwellwert arbeiten. Nimm 2 Werte vor dem jeweils untersuchten Wert und konstruiere Dir damit eine Gerade, die durch diese beiden Punkte geht. Dann guck, welchen Funktionswert die Gerade am Ort des zu testenden Wertes hat und wenn die mehr als um einen bestimmten Schwellwert von einander abweichen, dann nimmst Du den Wert halt raus. Das funktioniert, wenn die Krümmung Deiner Funktion nicht zu hoch ist.

    ...im Zweifelsfall kannst Du das auch beidseitig machen. Und wenn die Krümmung nennenswert ist, dann musst Du eben eine Näherung höherer Ordnung nutzen.



  • 5cript schrieb:

    Die Aufgabe liegt darin Graphen wie sowas hier (das ist schon ein relativ harter Fall):
    http://upload.wikimedia.org/wikipedia/commons/d/de/Fitted_line.svg
    zu analysieren und aus dem Bild auf die Werte zu kommen.

    Wenn Du bei solchen Daten Ausreißer rausfiltern sollst, dann ist das eigentliche Problem glaube ich eher an einer anderen Stelle. Die Daten da erscheinen mir derart mies zu sein, dass man eher daran arbeiten sollte, die Erzeugung der Messdaten zu verbessern.

    Ich meine, dort gehören mehr als 50% der Messpunkte in die Kategorie "Ausreißer". Ich weiß nicht, ob "Ausreißer" irgendwo als Begriff definiert ist, aber ich würde da nicht mehr von Ausreißern sprechen.



  • Gregor schrieb:

    5cript schrieb:

    Die Aufgabe liegt darin Graphen wie sowas hier (das ist schon ein relativ harter Fall):
    http://upload.wikimedia.org/wikipedia/commons/d/de/Fitted_line.svg
    zu analysieren und aus dem Bild auf die Werte zu kommen.

    Wenn Du bei solchen Daten Ausreißer rausfiltern sollst, dann ist das eigentliche Problem glaube ich eher an einer anderen Stelle. Die Daten da erscheinen mir derart mies zu sein, dass man eher daran arbeiten sollte, die Erzeugung der Messdaten zu verbessern.

    Der Witz ist das die Daten aus wissenschaftliche Papieren stammen. Die nur die Graphen haben, aber keine Werte (die ich haben will).
    Wie die aussehen (optisch im Bild) ist sehr variabel.
    Steigung der Kurve kann von flach bis drastisch gehen.

    EDIT: um den richtigen Graph zu erwischen (und wenig Fehlerquellen) haben (wir) ich die Markierung eingeführt. Das erspart mir viel nachdenken, wenn ein Mensch dahinter sitzt und die Richtung vorgibt, was jetzt tatsächlich der Graph ist.

    EDIT 2: Gauß Quadratur, Newton Schema, Spline Interpolation, führen bei so extremen offensichtlichen Ausreißern nur zu extremen Verfälschungen der wirklichen Punkte auf dem Graph

    EDIT 3: Ich weiß was gleich kommt: Du arbeitest an der falschen Stelle! Die Analyse muss verbessert werden! => Leichter gesagt als getan. Flexibilität <=> Performanz <=> Korrektheit - das ist nicht so leicht zu balancieren.



  • tausch in deiner regression den quadratischen loss durch den huber-loss oder den loss der ε-SVM aus. Die sind noch konvex, aber wesentlich stabiler. Wenn DAS nicht mehr hilft, dann bleiben dir wohl nur noch Verfahren die auf nicht konvexen Lossfunktionen basieren.



  • Ich kenne die Verfahren nicht, die Otze genannt hat, deshalb kann das unter Umständen schon vorgeschlagen worden sein...

    Du hast eigentlich ein Modell von den Daten. Und das scheint eine Gerade zu sein. Mach eine Art besten Fit des Modells an alle Deine Daten. Dann nimmst Du die Datenpunkte weg, die zu weit von dem parametrisierten Modell liegen und fittest nochmal. Dann hast Du neue Parameter für Dein Modell und vergleichst wieder mit ALLEN Datenpunkten und wirfst wieder die weg, die zu weit vom Modell entfernt sind. ...das wiederholst Du iterativ, bis Du irgendwie auskonvergiert bist.

    Ähnliche Vorgehensweisen gibt es in vielen Bereichen. Ich habe mit derartigem recht gute Erfahrungen gemacht und gehe deshalb davon aus, dass das funktionieren sollte. Vielleicht musst Du allerdings ein Mischverfahren zwischen den Iterationen ansetzen.



  • Ich bins das Problem nochmal an einer anderen Stelle angegangen und habe dann dafür ein sehr simples (minimalistisches) RANSAC implementiert.
    Das Ergebnis ist gut und die Rechenzeit ist im Erträglichen (mit Fortschritsbalken und WebWorker inkl Analyse).

    Das hier ist ein Beispiel (schwarze Linie = Random Sample Consensus, blau = Analysedaten):
    https://www.dropbox.com/s/p4g8uozznkbbcdg/plotted.png?dl=0

    (Ich habe das ganz primitiv geplottet)


Anmelden zum Antworten