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

Ziehen mit Wahrscheinlichkeit "ohne Zurücklegen"

 

Matlabübender

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.08.2013, 11:37     Titel: Ziehen mit Wahrscheinlichkeit "ohne Zurücklegen"
  Antworten mit Zitat      
Hallo zusammen,

ich habe einen Code geschrieben, mit dem ich Ziehen mit Wahrscheinlichkeit und ohne Zurücklegen simulieren kann. Dabei sollen sich die Anfangswahrscheinlichkeiten nicht ändern, wenn ein Ereignis stattgefunden hat.

Mein Code sieht folgendermaßen aus:

Code:
M = [0.03 fit1; 0.05 fit2; 0.08 fit3; 0.1 fit4; 0.15 fit5; 0.2 fit6; 0.4 fit7];
prop = M(:,1);
values = M(:,2);
cumprop = cumsum(M(:,1));
N = 5;
p = 0;
n = rand(N,1);
coinc = zeros(N,1);
for I = 1:N
    coinc(I) = values(find(n(I)<=cumprop,1,'first'));
    while find(ismember(coinc(1:I-1),coinc(I),'rows')==1)>1
        coinc(I) = values(find(n(I)<=cumprop,1,'first'));
        p = p+1;
    end
end


An dieser Stelle viele Grüße an Harald Wink

fit* sind Werte zwischen -1000 und 110 (circa)
Der Code macht zwar genau das was ich möchte ist aber leider seeehr langsam.

Wer hat Verbesserungsvorschläge?


Gruß,
Matlabübender


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 22.08.2013, 11:56     Titel:
  Antworten mit Zitat      
ok ich hab ne kurze nebenfrage. warum sind dein wahrscheinlichkeiten aufsummiert nicht 1? soll das so sein? ok und 2. wäre es nicht einfacher eine matrix zu erstellen in denen die fit werte je nach ihren häufigkeiten auftreten und dann daraus einfach 5 werte zu zihen ?
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Matlabübender

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2013, 07:48     Titel:
  Antworten mit Zitat      
Hallo Winkow,

ich gebe dir recht die Summe der Wahrscheinlichkeiten sollte natürlich 1 sein.
Und Danke für deine Idee zur Beschleunigung des Codes, werd ich gleich mal umsetzen.

Gruß,
Matlabübender
 
Matlabübender

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.08.2013, 10:30     Titel:
  Antworten mit Zitat      
Ich habe deinen Rat befolgt und einen Vektor a kreiert, in dem die fitwerte in Abhängigkeit ihrer Wahrscheinlichkeiten vorkommen.
Doch passt das mit der while-Schleife immer noch nicht.

Die while-Schleife soll dafür sorgen, dass wenn ein fitwert einmal gezogen wurde, nicht ein zweites mal gezogen bzw. in den Ergebnisvektor geschrieben wird.
(Manchmal klappt's, aber meistens wird's zur Endlosschleife).

Code:
zufallszahl = zeros(3+1,1);
for k1 =1:3
    zufallszahl(k1+1,1) = a(1,randi(100,1));
    p = 0;
        while find(ismember(zufallszahl(k1,1),zufallszahl(1:k1-1,1),'rows')==1)>=1
            zufallszahl(k1+1,1) = a(1,randi(100,1));
            p = p+1;
        end
end


Habe ich irgendwo einen Denkfehler oder ist im Code etwas falsch?

Gruß,
Matlabübender
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.08.2013, 10:39     Titel:
  Antworten mit Zitat      
Code:
clear;
M = [0.03 1; 0.05 2; 0.08 3; 0.1 4; 0.15 5; 0.2 6; 0.39 7];
matrix=[];
for k=1:size(M,1)
    matrix=[matrix;repmat(M(k,2),M(k,1)*1000,1)];        
end        
ergebniss=matrix(randperm(1000,6));

ich hatte mir das so gedacht.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Matlabübender

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.08.2013, 11:49     Titel:
  Antworten mit Zitat      
Vielen Dank für deine schnelle Antwort.

Jetzt gibt's dann nur noch ein Problem. Im Ergebnisvektor stehen mehrmals die gleichen fitwerte drin. Ich möchte aber, dass wenn ein fitwert gezogen wurde, dieser nicht mehr gezogen wird bzw. verworfen wird.
(Die Anfangswahrscheinlichkeiten sollen sich allerdings nicht ändern. Wenn ein Ereignis stattgefunden hat.)
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.08.2013, 11:54     Titel:
  Antworten mit Zitat      
die ausgangswahrscheinlichkeiten ändern sich aber wenn ein ergbeniss rausfliegt ^^
wenn ich 6 bunte kugeln im glas hab ist die wahrscheinlichkeit 1/6 ^^ wenn jetzt eine raus ist dann 1/5 für jede farbe. du hast 7 zahlen und willst 6 zihen. kannst du nicht die wahrschienlichkeiten 1-p machen und dann nur eine zihen und die restlichen nehmen ? entweder du passt die wahrscheinlichkeiten an und nimmst die werte raus die nicht genommen werden drüfen oder du überlegst dir einen anderen weg. sonst ist klar das die while schleife sehr lange läuft

Code:
M = [0.03 1; 0.05 2; 0.08 3; 0.1 4; 0.15 5; 0.2 6; 0.39 7];
matrix=[];
for k=1:size(M,1)
    matrix=[matrix;repmat(M(k,2),M(k,1)*1000,1)];        
end  
ergebniss=matrix(randperm(1000,1));
while length(ergebniss)<6
    a=matrix(randperm(1000,1));
    if ~ismember(ergebniss,a)
        ergebniss=[ergebniss,a];
    end
end

_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Matlabübender

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.08.2013, 12:14     Titel:
  Antworten mit Zitat      
Herzlichen Dank! Jetzt klappt's.
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.08.2013, 12:26     Titel:
  Antworten mit Zitat      
denke allerdings das es besser wäre die nicht gewollten werte rauszunehmen. giebt dann keine schwankungen in der laufzeit und läuft auch schnell bei gräßeren M
Code:
M = [0.03 1; 0.05 2; 0.08 3; 0.1 4; 0.15 5; 0.2 6; 0.39 7];
matrix=[];
for k=1:size(M,1)
    matrix=[matrix;repmat(M(k,2),M(k,1)*1000,1)];        
end  
ergebniss=[];
for k=1:6
a=matrix(randperm(size(matrix,1),1));
matrix(matrix==a)=[];
ergebniss=[ergebniss,a];
end

_________________

richtig Fragen
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 - 2024 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.