Gewichtete median-Berechnung
Ich bin auf der Suche für eine gute Studie material über die Berechnung des gewichteten median-Algorithmus und/oder Beispiel-code in C++. Die GEWICHTE meines median sind Werte zwischen 0 und 1. Könnten Sie mir empfehlen einige links?
- haben Sie ein paar Werte
[x, y]
und zu nehmen wie der gewichtete median, woy
ist Ihr Gewicht? bitte erläutern Sie Ihre Frage ein wenig. - Ich habe versucht, die Verwendung von Boost-Bibliothek Implementierung aber ich würde gerne mehr verstehen dieser Algorithmus, weil ich auf design eine Besondere Variante dieser Lösung in meinem Fall.
- Ich brauche, um den Wert zu finden, das minimiert den so genannten gewichteten Einstufung Fehler. Also ich habe ein paar Werte [Fehler, GEWICHTE], wo die Werte sind Natürliche zahlen, aber GEWICHTE sind Bruchzahlen zwischen 0 und 1. Ich habe gelesen, dass ich finden kann, der minimale Wert in der linearen Zeit mit gewichteten median-Algorithmus...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den gewichteten median ist definiert wie folgt:
Wenn
x
ist ein sortiertes arrayN
Elemente, undw
ist die Anordnung der GEWICHTE mit einem GesamtgewichtW
, dann der gewichtete median der letztenx[i]
so dass die Summe derw[i]
und alle vorherigen GEWICHTE sind weniger als oder gleichS/2
.In C++, kann dies ausgedrückt werden, wie so (vorausgesetzt
x
,w
undW
sind definiert wie oben)BEARBEITEN
So scheint es, dass ich diese Frage beantwortet zu hastig und machte einige Fehler. Fand ich eine nette Beschreibung des gewichteten median von der R-Dokumentation, beschreibt es so:
Aus dieser Beschreibung haben wir ein ziemlich straight-forward-Implementierung des Algorithmus. Wenn wir beginnen, mit
k == 0
, dann gibt es keine Elemente vorx[k]
, so dass das Gesamtgewicht der Elementex[i] < x[k]
weniger alsS/2
. Je nach Daten, das Gesamtgewicht der Elementex[i] > x[k]
werden können oder nicht weniger alsS/2
. So können wir nur vorwärts durch das array, bis diese zweite Summe wird weniger als oder gleichS/2
:Beachten Sie, dass, wenn der median ist das Letzte element (
medianIndex == N-1
), dannsum == 0
, so ist die Bedingungsum > S/2
ausfällt. Sok
nie out of bounds (es sei dennN == 0
!). Auch, wenn es zwei Elemente, die die Bedingung erfüllen, die der Algorithmus wählt immer die erste.[x[i-1], x[i])
ist ein median.i-1
. was passiert also, wenn w[0]: 0,9? tuti
Inkrement auf Pause (sonst haben Siex[-1]
)? könnte besser sein, zu initialisieren Summew[0]
und starten Sie die Schleife von 1? Nein, das scheint nicht richtig. sorry, verwechselt werden können. ich weiß was du meinst, sowieso.Hier ist eine Implementierung des gewichteten median für die zunächst unsortierten Vektoren. Es baut auf der sehr guten Antwort von @Ken Wayne VanderLinde für die median-Berechnung, und auf der index-sorter in dieser thread.
Es funktioniert mit jedem Vektor-Art, die unterstützt
operator[](int)
undsize()
(--daher keine Verwendungstd::accumulate
etc.).