Autor Beitrag
hoef
Hält's aus hier
Beiträge: 3

win xp
delphi 6
BeitragVerfasst: So 27.11.05 16:29 
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

_________________
hello world
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Di 29.11.05 11:43 
Hallo,

Hier 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.
ausblenden 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
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 3

win xp
delphi 6
BeitragVerfasst: Di 29.11.05 12:28 
Das sieht supper aus!!! Das bringt mich ein großes Stück weiter.

Danke

Daniel