WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Häufigkeit eines Vektors darstellen

 

supernerd
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 16.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.10.2011, 20:18     Titel: Häufigkeit eines Vektors darstellen
  Antworten mit Zitat      
Hi,
bei meiner momentanen Aufgabe soll ich unter anderem zeigen, dass der randperm() Befehl auch wirklich gleich verteilt zufällige Permutationen eines Vektors erzeugt.
Am liebsten würde ich das einfach grafisch zb mit dem hist() Befehl lösen, allerdings stehe ich jetzt vor dem Problem, wie ich dem Befehl beibringen soll, dass er einen Vektor jeweils als Wert ansieht und nicht einfach plottet, wie oft jede Zahl in den allen Vektoren vorkommt.
Gibt es da eine einfache Lösung?
Oder sollte ich es besser mit einem anderen Lösungsansatz versuchen?
Danke!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.10.2011, 20:52     Titel:
  Antworten mit Zitat      
Hallo,

wie wärs mit hist3? Du würdest die verschiedenen Ergebnisse von randperm in einer Matrix anordnen.
Die Komponenten des Vektors gehen in die eine Richtung, die Verteilung der Werte dafür in die andere.
Code:

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 25.10.2011, 12:36     Titel: Re: Häufigkeit eines Vektors darstellen
  Antworten mit Zitat      
Hallo supernerd,

Nun, das ist sehr einfach:
RANDPERM(N) erzeugt keine gleich-verteilten Permutationen.
Dies wird dies wird ja auch in der Dokumentation nicht behauptet.

Die Abweichung zur Gleich-Verteilung aber nur sehr klein:
In Matlab 2009a konnte man sich noch den zugrundeliegenden Algorithmus anschauen, da RANDPERM als M-File ausgeliefert wurde:
Code:
[ignore, p] = sort(rand(1, n));

Es ist also der Sortierungsindex eines RAND-Vektors.

1. RAND erzeugt Zufallszahlen mit dem Mersenne-Twister-Algorithmus und mit 53-Bit Precision. Das heißt der Mindest-Abstand zwischen zwei Elementen ist 2^-53. Da nun der Mersenne-Twister ein sehr guter Random-Number-Generator ist, werden mit einer gewissen sehr kleinen Wahrscheinlichkeit in einem RAND(1, n) Vektor Zahlen doppelt vorkommen.

2. SORT ist ein stabilisierter QuickSort. "Stabilisiert" heißt, dass bei mehrfach vorkommen Elementen die Reihenfolge im Output der Reihenfolge im Input entspricht. Für RANDPERM ist das aber ein Nachteil: Mit einer (winzigen) Wahrscheinlichkeit erhält man für n=2 zwei gleiche Zufallszahlen, damit ist die Permutation garantiert [1,2], obwohl sie eigentlich in genau der Hälfte aller Fälle [2,1] sein müsste. q.e.d.

Nun ist das eigentlich ein Lapsus, weil Donald E. Knuth das Problem ausgiebig in "The Art of Computer Programming" behandelt hat. Schneller und bewiesenermaßen gleichverteilt ist der Fisher-Yates-Shuffle-Algorithmus (siehe Google), seitdem auch als Knuth-Shuffle bekannt. Zudem kann man hiermit auch effizient m <= n Elemente ausgeben, z.B. 10 garantiert unterschiedliche Integers aus 1:1e6. Mit RANDPERM(n) benötigt man dazu 1e6 Zufallszahlen und eine sehr teurer Sortierung.

In MATLAB 2011b gibt es nun glücklicherweise ein Update: RANDPERM(N,M) nutzt nun auch den Fisher-Yates-Shuffle. Wegen der Rückwärtskompatibilität ist RANDPERM(N) aber unverändert, siehe:
Code:
tic; for i=1:1000, p = randperm(1e4); end; toc
>> 1.02 seconds
tic; for i=1:1000, p = randperm(1e4, 1e4); end; toc
>> 0.38 seconds

Wenn Du also Gleichverteilung zeigen sollst, mache es für RANDPERM(N, N).

Zwei Methoden um die Gleichverteilung zu messen:
1. Erzeuge viele Permutationen der Länge n für n=2,3,8,16,32. Summiere die Werte auf und teste, ob sie alle den (fast) gleichen Wert erreichen.
2. Schreibe die Permutationen in eine Matrix und messe die Häufigkeit der einzelnen Vektoren:
Code:
[uR, ~, ix] = unique(P, 'rows');
n = histc(ix, 1:size(uR, 1));


Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
supernerd
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 16.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2011, 16:09     Titel:
  Antworten mit Zitat      
Hi Jan,
danke für die ausführliche Antwort! Wieder was gelernt ^^
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.