Rückgabe des mittleren n (Werte nicht Index) aus einer Sammlung

7

Ich habe ein List<int> und ich muss die Ausreißer entfernen, also möchte ich einen Ansatz verwenden, bei dem ich nur das mittlere n nehme. Ich möchte die Mitte in Bezug auf Werte, nicht Index.

Zum Beispiel würde ich angesichts der folgenden Liste, wenn ich die mittleren 80% wollte, erwarten, dass die 11 und 100 entfernt würden.

11,22,22,33,44,44,55,55,55,100.

Gibt es eine einfache / eingebaute Möglichkeit, dies in LINQ zu tun?

    
will 18.04.2011, 16:38
quelle

5 Antworten

11
  

Ich habe ein List<int> und ich muss die Ausreißer entfernen, also möchte ich einen Ansatz verwenden, bei dem ich nur das mittlere n nehme. Ich möchte die Mitte in Bezug auf Werte, nicht Index.

Das Entfernen von Ausreißern hängt vollständig von dem statistischen Modell ab, das die Verteilung der Daten, die Sie nicht für uns bereitgestellt haben, genau beschreibt.

Wenn Sie davon ausgehen, dass es sich um eine normale (Gaußsche) Verteilung handelt, möchten Sie Folgendes tun:

Berechnen Sie zuerst das Mittel . Das ist einfach; es ist nur die Summe geteilt durch die Anzahl der Elemente.

Berechnen Sie zweitens die Standardabweichung . Die Standardabweichung ist ein Maß dafür, wie weit die Daten verteilt sind. Berechne es mit:

  • nimm den Unterschied von jedem Punkt vom Mittelwert
  • Quadrate den Unterschied
  • nehmen Sie den Mittelwert der Quadrate - das ist die Varianz
  • nehme die Quadratwurzel der Varianz - das ist die Standardabweichung

Bei einer Normalverteilung liegen 80% der Artikel innerhalb von 1,2 Standardabweichungen des Mittelwerts. Nehmen wir zum Beispiel an, dass der Mittelwert 50 und die Standardabweichung 20 beträgt. Sie würden erwarten, dass 80% der Stichprobe zwischen 50 - 1,2 * 20 und 50 + 1,2 * 20 fallen würden. Sie können dann Elemente aus der Liste herausfiltern das sind außerhalb dieses Bereichs.

Beachten Sie jedoch, dass nicht Ausreißer entfernt. Dies entfernt Elemente, die mehr als 1,2 Standardabweichungen vom Mittelwert haben, um ein 80% Intervall um den Mittelwert zu erhalten. In einer Normalverteilung erwartet man regelmäßig "Ausreißer". 99,73% der Punkte liegen innerhalb von drei Standardabweichungen des Mittelwerts, was bedeutet, dass es bei tausend Beobachtungen völlig normal ist, zwei oder drei Beobachtungen mehr als drei Standardabweichungen außerhalb des Mittelwerts zu sehen! In der Tat, irgendwo bis zu, sagen wir, fünf Beobachtungen mehr als drei Standardabweichungen vom Mittelwert entfernt, wenn tausend Beobachtungen gegeben werden, gibt es wahrscheinlich keinen Ausreißer . .

Ich denke, Sie müssen sehr genau definieren, was Sie mit Ausreißer meinen und warum Sie versuchen, sie zu eliminieren. Dinge, die wie Ausreißer aussehen, sind möglicherweise keine Ausreißer, sondern echte Daten, auf die Sie achten sollten.

Beachten Sie auch, dass keine dieser Analysen korrekt ist, wenn die Normalverteilung falsch ist! Sie können große, große Probleme bekommen, die aussehen, die wie Ausreißer aussehen, obwohl Sie tatsächlich das gesamte statistische Modell falsch verstanden haben. Wenn das Modell "schwanzlastiger" ist als die Normalverteilung, dann sind Ausreißer üblich und nicht wirklich Ausreißer . Achtung! Wenn Ihre Distribution nicht normal ist, müssen Sie uns die Verteilung mitteilen, bevor wir Ihnen empfehlen können, Ausreißer zu identifizieren und sie zu eliminieren.

    
Eric Lippert 18.04.2011 17:37
quelle
4

Sie können die Methode Enumerable.OrderBy verwenden, um Ihre Daten zu sortieren Liste, dann verwenden Sie Enumerable.Skip und die Enumerable.Take Funktionen, zB:

%Vor%

Wo nums ist Ihre Liste von ganzen Zahlen.

Herauszufinden, welche Werte als Argumente für Skip und Take verwendet werden sollen, sollte ungefähr so ​​aussehen, wenn Sie nur die Werte "middle n " wollen:

%Vor%

Wenn das Ergebnis von (nums.Count - n) / 2 jedoch keine Ganzzahl ist, wie soll sich der Code verhalten?

    
Donut 18.04.2011 16:40
quelle
2

Angenommen, Sie machen keine gewichteten durchschnittlichen witzigen Geschäfte:

%Vor%

Sie können dann nach Bedarf nach Gewicht filtern. Lassen Sie die obere / untere n % nach Wunsch fallen.

In Ihrem Fall:

%Vor%

Bearbeiten: Als Erweiterungsmethode, weil ich Erweiterungsmethoden mag:

%Vor%

Verwendung:

%Vor%     
Pete M 18.04.2011 16:55
quelle
2

Wenn Sie statistische Ausreißer aus einer Reihe von Werten ausschließen möchten, berechnen Sie normalerweise das arithmetische Mittel und die Standardabweichung für die Menge und entfernen dann Werte, die weiter vom Mittelwert entfernt sind, als Sie möchten (Messung im Standard) Abweichungen). Eine Normalverteilung - Ihre klassische glockenförmige Kurve - weist folgende Eigenschaften auf:

  • Ungefähr 68% der Daten werden innerhalb +/- 1 Standardabweichung vom Mittelwert liegen.
  • Etwa 95% der Daten liegen innerhalb von +/- 2 Standardabweichungen vom Mittelwert.
  • Etwa 99,7% der Daten werden innerhalb von +/- 3 Standardabweichungen des Mittelwerts liegen.

Sie können Linq-Erweiterungsmethoden für die Berechnung der Standardabweichung (und anderer statistischer Funktionen) unter Ссылка abrufen

    
Nicholas Carey 18.04.2011 17:24
quelle
0

Ich werde die Gültigkeit der Berechnung von Ausreißern nicht in Frage stellen, da ich eine ähnliche Notwendigkeit hatte, genau diese Art von Auswahl zu treffen. Die Antwort auf die spezifische Frage, das mittlere n zu nehmen, ist:

%Vor%

Dies überspringt den ersten Gegenstand und stoppt vor dem letzten, so dass Sie nur die mittleren n Gegenstände erhalten. Hier ist ein Link zu einer .NET Fiddle, die diese Abfrage demonstriert.

Ссылка

    
Sirius_B 03.02.2016 14:19
quelle

Tags und Links