Entwickler-Ecke

Algorithmen, Optimierung und Assembler - alpha-quantile


hoef - So 27.11.05 16:29
Titel: alpha-quantile
Hallo,
ich hoffe ich kann hier eine Anregung finden und wende mich so an Leute die sich besser mit Mathe auskennen wie ich.
Ich suche nach einen Algoritmus zum berechen von verschieden quantilen Daten aus einen float Array. Wenn jemand eine Idea hatt wäre schön...

Gruß

Daniel


Horst_H - Di 29.11.05 11:43

Hallo,

Hier [http://www.informatik.hu-berlin.de/~luetzken/sas/sas-smas.html] ist ja beschrieben, worum es geht.
Alpha - Quantil ist ja fuer Alpha = 0.5 der Midian.
Das erinnert an Quicksort, wobei das Alpha Quantil X(i) der Pivot ist.

Falls man von der selben Menge Werten verschiedene Quantile braucht, ist sortieren und anschliessendes direktes zugreifen ueber einen gerechneten Index das Leichteste.
Dazu musst Du Werte und alte Position zusammenfassen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
type
  tWert     : integer; // oder extended etc...
  tSortWert : packed record
                         pWert : ^tWert;
                         OrgIndex : integer
              end;
  tSortFeld : array of tSortWert;
var
  Sortfeld  : tSortFeld;
  WertFeld : array of tWert;
{
Jetzt brauchst Du nur dem Sortfeld die Werte zuweisen und anschliessend sortieren.
}

Laenge := High(WertFeld)-Low(WertFeld) +1;
setlength(SortFeld,Laenge );
For i := Low(WertFeld) to High(WertFeld) do 
  With SortFeld[i-Low(WertFeld)] do
    begin
    pWert := @WertFeld[i];
    OrgIndex := i;
    end;
Sort(SortFeld,0,Laenge-1);


Falls nur ein Alpha Quantil gefragt ist, kann man natuerlixch schneller daran kommen.Z.B. eine Art Quicksort, wobei aber nur der Abschnitt weiter rekursiv untersucht wird der zielführend ist.
Dein Alpha-Quantil liegt ja fest und laesst sich in einen Index des Sortfeldes umrechnen.
In der Abbruchbedingung von quicksort partition steht links direkt fuer das Alpha-Quantil.
Falls links das Alpha quantil dann ist alles gut,
sonst
.falls links > gesuchtespartition(0..links-1) falls links > gesuchtes
.sonst partition(links+1..rechts)
Im schlimmsten Fall wird es Alphaquantilindex mal aufgerufen, falls man immer genau das verbliebene Maximum als Pivot erwischt.

Gruss Horst
Alternativ Radixsort maessig.
Bestimme Minimum, Maximum um Spannweite zu den Wertebereich zu bestimmen, falls diese nicht schon ausreichend genau bekannt sind.
Teile diesen Bereich in 1000(000 wie es beliebt, falls es Sinn macht) Teile.
Jetzt ein Durchgang und zählen, wie haeufig Werte in seinen zugehoerigen Wertebereich fallen.
Der Index laesst sich ja berechnen aus

Delphi-Quelltext
1:
2:
3:
4:
5:
ANZTEILE := 1000-1;
Zaehlfeld : array [0..ANZTEILE] of integer;
//Pos :=round((Wert-Minimum)/Spannweite*ANZTEILE).
For i := Low(WertFeld) to High(WertFeld) do 
  inc(ZaehlFeld({Pos :=}round((Wert[i]-Minimum)/Spannweite*ANZTEILE))

Jetzt aus den Teilen die Summenhaufikeit bestimmen in welchen Abschnitt das gesuchte Alphaquantil liegen muss.
Sei dies zum Beispiel im Fach 763 von 1000 mit 12 Treffern.
Dann kann man in einem zusaetzlichen Durchgang genau diese 12 finden.


hoef - Di 29.11.05 12:28

Das sieht supper aus!!! Das bringt mich ein großes Stück weiter.

Danke

Daniel