Median, 2 Vektoren < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 18:39 Mi 25.08.2010 | Autor: | danm357 |
Liebe Forenuser,
leider habe ich wieder ein Problem, bei dem ich mit meinen spärlichen Programmier nicht weiterkomme.
Ich habe 2 Vektoren. Der eine ist mit seinen Indices gefüllt, also z.B.: a=[1,2,3,4,5,6,7,8,9,10]
Der andere Vektor ist mit beliebigen Zahlen gefüllt, z.B.: b=[0,0,0,2,3,8,4,1,0,0] (man kann sich a als x-Werte und b als die zugehörigen y-Werte vorstellen).
Jetzt möchte ich den Median des Vektors b bezüglich des Vektors a berechnen.
Ich verstehe darunter, dass man zunächst folgenden Vektor konstruiert:
c=[0, 0, 0, 4, 4, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 0, 0]. Diesen erhalte ich, indem ich die Werte von a so oft schreibe, wie in b angegeben. Also: 0 mal 1; 0 mal 2; 0 mal 3; 2 mal 4 = 4, 4; 3 mal 5 = 5, 5, 5; etc.
Berechne ich nun den Median für den Vector c, erhalte ich 6. Sprich, bezüglich des Vektors a, sind die Hälfte der Werte von b unterhalb von 6 und die andere Hälfte oberhalb von 6.
Nun meine Frage: Wie programmiert man das (in IDL, oder C++)?
Für Hinweise jeder Art wäre ich dankbar!
P.S.: Im Mathe-Forum habe ich eine ähnliche Frage gestellt. Wer will, kann sich dieser auch gerne annehmen
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:41 Mi 25.08.2010 | Autor: | felixf |
Moin,
bitte stell die Frage hier im Forum nur einmal. Die andere Frage ist hier.
LG Felix
|
|
|
|
|
Hallo!
@ felix: Du meinst wohl eher https://matheraum.de/read?t=708487.
Aber nu gehts hier ja weiter.
Zu Thema:
Vermutlich macht es keinen Sinn, eine Fließkommazahl anzugeben, sondern es reicht, einen Arrayindex dafür anzugeben.
Dann kannst du zunächst mal die Summe [mm] $\sum a_i*b_i [/mm] $ berechnen. Die Hälfte davon muß links vom Median-index liegen. Und anschließend summierst du erneut auf, diesmal aber Schrittweise, und du vergleichst nach jedem Schitt, die neue Summe mit der halben alten Summe. So findest du raus, bei welchem Index du den Median erreicht hast.
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 20:53 Mi 25.08.2010 | Autor: | danm357 |
Hallo,
vielen Dank für Deine Antwort.
Entschuldige bitte den Doppelpost, ich bin zum einem an einer Informatik-Lösung interessiert und an einer alternativen Mathe-Lösung, falls denn eine existiert. Daher die zwei Posts.
Wenn ich nun Deinem Vorschlag folge (und ihn richtig verstehe), bekomme ich mit
[mm] a_{i}*b_{i} [/mm] = [0, 0, 0, 8, 15, 48, 28, 8, 0, 0]
Summiere ich nun auf [mm] (\summe_{i=1}^{n=10} a_{i}*b_{i}) [/mm] , erhalte ich 107. Die Hälfte davon ist 53.5, also weit weg vom ursprünglich berechneten Median-Index.
Also entweder verstehe ich Dich falsch, oder Dein Vorschlag funktioniert noch nicht ganz richtig.
Nennt man das eigentlich wirklich Median-Index? Lol, wenn man das Fachwort nicht kennt, ist es schwierig eine Lösung zu finden.
Würde mich über eine weitere Antwort freuen!
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 20:59 Mi 25.08.2010 | Autor: | felixf |
Moin,
> Wenn ich nun Deinem Vorschlag folge (und ihn richtig
> verstehe), bekomme ich mit
>
> [mm]a_{i}*b_{i}[/mm] = [0, 0, 0, 8, 15, 48, 28, 8, 0, 0]
>
> Summiere ich nun auf [mm](\summe_{i=1}^{n=10} a_{i}*b_{i})[/mm] ,
> erhalte ich 107. Die Hälfte davon ist 53.5, also weit weg
> vom ursprünglich berechneten Median-Index.
du hast seinen Vorschlag nicht richtig verstanden. Der Vorschlag ist allerings auch nicht richtig.
> Also entweder verstehe ich Dich falsch, oder Dein Vorschlag
> funktioniert noch nicht ganz richtig.
>
> Nennt man das eigentlich wirklich Median-Index? Lol, wenn
> man das Fachwort nicht kennt, ist es schwierig eine Lösung
> zu finden.
Nun, der Begriff stammt halb von dir. Du hast die Elemente in $a$ als Indices bezeichnet. Event_Horizon meint damit den Index (also das Element aus $a$), welches der Median ist.
LG Felix
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 21:02 Mi 25.08.2010 | Autor: | felixf |
Moin,
> Ich habe 2 Vektoren. Der eine ist mit seinen Indices
> gefüllt, also z.B.: a=[1,2,3,4,5,6,7,8,9,10]
> Der andere Vektor ist mit beliebigen Zahlen gefüllt,
> z.B.: b=[0,0,0,2,3,8,4,1,0,0] (man kann sich a als x-Werte
> und b als die zugehörigen y-Werte vorstellen).
>
> Jetzt möchte ich den Median des Vektors b bezüglich des
> Vektors a berechnen.
> Ich verstehe darunter, dass man zunächst folgenden Vektor
> konstruiert:
> c=[0, 0, 0, 4, 4, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7,
> 7, 7, 8, 0, 0]. Diesen erhalte ich, indem ich die Werte von
> a so oft schreibe, wie in b angegeben. Also: 0 mal 1; 0 mal
> 2; 0 mal 3; 2 mal 4 = 4, 4; 3 mal 5 = 5, 5, 5; etc.
>
> Berechne ich nun den Median für den Vector c, erhalte ich
> 6. Sprich, bezüglich des Vektors a, sind die Hälfte der
> Werte von b unterhalb von 6 und die andere Hälfte oberhalb
> von 6.
wie der Vektor a aussieht, ist fuer die Medianberechnung ziemlich egal. Erstmal berechnest du $A := [mm] \sum_{j=0}^{n-1} [/mm] b[j]$. Dann schaust du, fuer welches $i$ gilt [mm] $\sum_{j=0}^{i-1} [/mm] b[j] [mm] \le [/mm] A/2 [mm] \le \sum_{j=i}^{n-1} [/mm] b[j]$. (Es gibt genau ein solches $i$, wenn $A > 0$ ist, also $b$ nicht der Nullvektor.)
In dem Fall ist $a[i]$ der Median von deinem Vektor $c$.
LG Felix
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 21:55 Mi 25.08.2010 | Autor: | danm357 |
Hallo,
aha, auch noch wach
Danke für die spontanen Antworten. Das Event_Horizon mit Median-Index den Index bezeichnet, der den Median darstellt, habe ich mir schon fast gedacht
Den Vektor a habe ich nur eingeführt, um den funktionellen Zusammenhang (a kann als x-Werte und b als y-Werte angesehen werden) zu verdeutlichen:
Stell Dir vor, a sind mögliche Antworten in einer Umfrage (z.B. wie hat das Essen geschmeckt: sehr schlecht, schlecht, mittelmässig, gut, etc.) und b sind die Anzahl Antworten, die gegeben worden. Dann wäre es doch interessant zu wissen, bei welcher Bewertung 50% der Antworten drüber und drunter sind.
Daher suche ich nach dem „Median-Index“.
Deine Lösung finde ich ganz gut, aber ganz korrekt ist sie nicht. Den Umweg mit dem A und A/2 kann man sich sparen
Korrekt wäre Deine Lösung, wenn man das i sucht, für welches gilt:
[mm] \summe_{j=0}^{i-1}b[j] \le \summe_{j=i}^{n-1}b[j]
[/mm]
Ok, das ist eigentlich eine Art Definition für den Median, die mir vorher auch fast klar war (Eigentlich hast Du damit meine Mathe-Frage beantwortet ).
Solch einen Algorithmus kann ich vielleicht in mein Computer-Programm einzubauen. Ich frage mich jedoch, ob es nicht günstiger wäre, sich einen Vektor c produzieren zu lassen, um dann auf diesen die in IDL vorprogrammierte Median-Funktion anzuwenden.
Leider weiss ich nicht, wie ich den Vektor c automatisch konstruieren kann, oder ob das wirklich nötig ist (Vielleicht kann man ja Deinen angepassten Algorithmus elegant und rechenzeitsparend programmieren, dann würde ich das sofort machen).
Wie dem auch sei, ich Danke nochmals für die Antwort und freue mich über Anregungen, wie ich denn welche Lösungsvariante (Vektor c, Vgl. der Summen) am besten programmieren kann.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 22:31 Mi 25.08.2010 | Autor: | felixf |
Moin!
> aha, auch noch wach
Bei mir ist frueher Nachmittag! :)
> Deine Lösung finde ich ganz gut, aber ganz korrekt ist sie
> nicht. Den Umweg mit dem A und A/2 kann man sich sparen
Rein mathematisch ja, wenn man es effizient implementieren will, nur bedingt.
> Korrekt wäre Deine Lösung, wenn man das i sucht, für
> welches gilt:
>
> [mm]\summe_{j=0}^{i-1}b[j] \le \summe_{j=i}^{n-1}b[j][/mm]
Genau das tut meine Loesung: es ist $A = [mm] \sum_{j=0}^{i-1} [/mm] b[j] + [mm] \sum_{j=i}^{n-1} [/mm] b[j]$, womit da steht [mm] $\sum_{j=0}^{i-1} [/mm] b[j] [mm] \le [/mm] A - [mm] \sum_{j=0}^{i-1} [/mm] b[j]$, also nichts anderes als $2 [mm] \sum_{j=0}^{i-1} [/mm] b[j] [mm] \le [/mm] A$, oder anders geschrieben [mm] $\sum_{j=0}^{i-1} [/mm] b[j] [mm] \le \tfrac{1}{2} [/mm] A$ unter der Nebenbedingung, dass $i$ maximal ist. Das wiederum ist aequivalent zu [mm] $\sum_{j=0}^{i-1} [/mm] b[j] [mm] \le \tfrac{1}{2} [/mm] A [mm] \le \sum_{j=i}^{n-1} [/mm] b[j]$.
> Ok, das ist eigentlich eine Art Definition für den Median,
> die mir vorher auch fast klar war (Eigentlich hast Du damit
> meine Mathe-Frage beantwortet ).
Und gleichzeitig deine Algorithmus-Frage, da man es sofort mit zwei for-Schleifen implementieren kann.
> Solch einen Algorithmus kann ich vielleicht in mein
> Computer-Programm einzubauen. Ich frage mich jedoch, ob es
> nicht günstiger wäre, sich einen Vektor c produzieren zu
> lassen, um dann auf diesen die in IDL vorprogrammierte
> Median-Funktion anzuwenden.
> Leider weiss ich nicht, wie ich den Vektor c automatisch
> konstruieren kann, oder ob das wirklich nötig ist
> (Vielleicht kann man ja Deinen angepassten Algorithmus
> elegant und rechenzeitsparend programmieren, dann würde
> ich das sofort machen).
Ich vermute, es ist Verschwendung von Rechenzeit und Speicherplatz, den Vektor $c$ erst auszurechnen. Stell dir vor, dass $b$ Werte wie 9812391 und 1298424587 enthaelt. Bei kleinen Umfragen wie in deinem Beispiel wird das eher nicht vorkommen, aber sagen wir bei 1000 Teilnehmern ist es schon etwas verschwenderischer als noetig.
LG Felix
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 23:01 Mi 25.08.2010 | Autor: | danm357 |
Hallo Felix,
bevor ich nun zu Bett gehe wollte ich noch für Deine neue Antwort danken.
Schön, dass Du das mit dem A so ausführlich erklärst. Wenn man das verwendet, ist es für das Computer-Programm sicher effizienter als meine rein mathematische Betrachtungsweise.
Vielen Dank auch für den Hinweis, dass das mit dem Vektor c ungünstiger ist, als mit der Alternative.
Morgen werde ich versuchen, das ganze in mein Computer-Programm einzubauen. Falls ich dort noch Probleme mit den 2 for-Schleifen bekommen sollte, werde ich mich wieder melden
Noch einen schönen Nachmittag!
|
|
|
|