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

Funktion mit Wahrscheinlichkeit ablaufen lassen ?

 

Chrisch
Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 09.06.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2008, 09:46     Titel: Funktion mit Wahrscheinlichkeit ablaufen lassen ?
  Antworten mit Zitat      
Wie kann ich es am besten realisieren, dass ich durch eine Benutzereingabe eine Funktion mit einer bestimmten Wahrscheinlichkeit ablaufen lassen kann ?

Nur als Beispiel möchte ich als Benutzer eine Schleife nur in 30 % aller Fälle durchlaufen, damit ihr Gewicht auf das Endergebnis gering bleibt.
Das soll natürlich variabel sein.

Ich habe es so versucht


Code:

disp('Eingabe')
MFaktor=input('')

Wahrscheinlichkeit= 1 + (MFaktor*rand([1,1]))

 


aber mit rand erreiche ich ja nur eine Gleichverteilung, dementsprechend ist es irrelevant welche Wahrscheinlichkeit der Benutzer vorgibt.

Jemand eine Idee ?
Danke im Vorraus
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden


steffi
Forum-Century

Forum-Century



Beiträge: 149
Anmeldedatum: 07.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2008, 10:10     Titel:
  Antworten mit Zitat      
Du kannst den Benutzer die Eingabe machen lassen, wie von dir vorgeschlagen. Dann könntest du das Ablaufen der Funktion von einer Zufallszahl abhängig machen. Ob diese z.B. unter/über der Eingabe des Benutzers ist. Hab ich mich verständlich ausgedrückt Rolling Eyes

Code:

MFaktor=input('') % sollte zwischen 0 und 1 sein

if rand(1,1)>MFaktor
%dein Code
end
 


Hoffe es hilft
_________________

Wenn ich bei der Arbeit mit Computern eins gelernt habe dann das ich einem Computer nur soweit traue wie ich ihn werfen kann.
Private Nachricht senden Benutzer-Profile anzeigen
 
Chrisch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 09.06.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2008, 10:19     Titel:
  Antworten mit Zitat      
ja aber die Zufallszahlen sind doch auch alle gleichwahrscheinlich oder ?
Also ist es doch egal, ob der Benutzer 0.1 oder 0.8 eingibt ?

Hm, na ich versuch es mal
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 12.08.2008, 10:22     Titel:
  Antworten mit Zitat      
Wie genau soll denn die Benutzereingabe auf den Code Einfluss haben?

Prinzipiell, also wenn Du zu 30% Wahrscheinlichkeit eine Schleife ausführen willst, ginge das am einfachsten über:
Code:
wk = rand(1,1);
if wk<=0.3
    % Schleife
else
    % was anderes machen
end


Wenn Du die Wahrscheinlichkeit selbst angeben willst, eben entsprechend die 0.3 durch den Wert, den input liefert, ersetzen.
Private Nachricht senden Benutzer-Profile anzeigen
 
steffi
Forum-Century

Forum-Century



Beiträge: 149
Anmeldedatum: 07.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2008, 10:27     Titel:
  Antworten mit Zitat      
Hallo,

so wie Keloid hatte ich mein Bsp. gemeint. Wie geschrieben, kann sein, dass ich mich unverständlich ausdrücke....

das
Code:
liefert dir gleichverteilt Zahlen zwischen 0 und 1, wie du weißt. Wenn du jetzt das durchlaufen der Schleife davon abhängig machst, ob rand(1,1) unter einer Schwelle war oder nicht, erhälst du die Wahrscheinlichkeit, die du wünschst je nach Wahl der Schwelle.

Wenn du es testen möchtest, kannst du doch bei Durchlauf der Schleife, einen Zähler bei jedem Schleifendurchlauf um 1 hochzählen. Dann prüfst du wie oft deine Schleife durchlaufen wurde im Verhältnis zur Gesamtanzahl der Durchläufe. Bei genügend Durchläufen wirst du dich dem vorgegebenen prozentsatz nähern
_________________

Wenn ich bei der Arbeit mit Computern eins gelernt habe dann das ich einem Computer nur soweit traue wie ich ihn werfen kann.

Zuletzt bearbeitet von steffi am 12.08.2008, 10:33, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Chrisch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 09.06.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2008, 10:30     Titel:
  Antworten mit Zitat      
Hm so ähnlich hatte ich das schon. Ich nahm halt an, das der rand-Befehl
mir Zufallszahlen liefert die alle gleich wahrscheinlich auftreten können.
Also kam ich auf den Trichter rand(..) mit einem MFaktor zu wichten.

Aber so sollte es funktionieren. Vielen Dank euch beiden, beide Vorschläge kann ich gebrauchen.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 12.08.2008, 10:48     Titel:
  Antworten mit Zitat      
rand erzeugt gleichverteilte Zufallsvariablen im halboffenen Intervall (0,1]. Natürlich nur mit einer bestimmten Genauigkeit, die vom verwendeten Algorithmus abhängt.

Wenn Du allerdings erklären könntest, wie Du Dir die Funktionsweise des Codes vorgestellt hast, können wir Dir eventuell noch weiterhelfen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Chrisch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 09.06.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2008, 11:32     Titel:
  Antworten mit Zitat      
Ich glaube ich habe ein Verständnisproblem!
Ich versuchs mal.
Ich verallgemeinere meinen Code etwas, ist sonst schwer lesbar.
Folgendes passiert :

Code:


disp('Wähle jetzt eine Wahrscheinlichkeit ( 0.0 bis 1.0 ist möglich)')
     
           
Wahrscheinlichkeit=input('')                


if (Wahrscheinlichkeit<0 | Wahrscheinlichkeit>1.0)
   
    disp('Ungültig. Es wird eine Wahrscheinlichkeit von 55% angenommen ')
   
    Wahrscheinlichkeit=0.55

   
end;

%......
%diverse Programmbestandteile
%......

    W=rand(1,1);
    if W<=Wahrscheinlichkeit

%führe Funktion aus
disp('wird ausgeführt')

else

%führe Funktion nicht aus, mach dafür was anderes
disp('es passiert was anderes')
end;

 



Wenn die Zufallszahlen gleich verteilt sind, bedeutet es doch dass der Zufallsgenerator im Intervall [0..1] jede Zahl mit der gleichen Wahrscheinlichkeit ausspucken kann oder ?

Dementsprechend ist es doch irrelevant, welche "Schwelle" mein Benutzer nun eingibt, ob 25% oder 90% ..weil diese Werte doch nicht unwahrscheinlicher sind als andere, oder ?
Der Generator kann doch gleich wahrscheinlich 0.25 und 0.9 ausgeben ?


Ich möchte eigentlich echte Wahrscheinlicht ..Gibt mein Benutzer 0.2 ein, möchte ich in ca. 2 bis 3 von 10 Versuchen bestimmte Programmteile aufrufen, die in allen anderen Fällen nicht aufgerufen werden.

Uff Shocked
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Chrisch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 09.06.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2008, 11:38     Titel:
  Antworten mit Zitat      
Warum das alles ?
Genetische Algorithmen.
z.b. in meinem Falle lasse ich eine bestimmte N-lange Codierung
bitweise mutieren. Wird diese Funktion ständig aufgerufen divergiert meine Ergebnisfunktion und ich komme nie zum Ziel. Deshalb sollen manche Programmteile nur sachte und selten ausgeführt werden, damit ihr Einfluß sich in Grenzen hält.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
steffi
Forum-Century

Forum-Century



Beiträge: 149
Anmeldedatum: 07.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2008, 11:49     Titel:
  Antworten mit Zitat      
der Code schaut doch gut aus, wenn ich dich richtig verstehe, macht der Code genau das was du möchtest.

Bsp. für das Verständnis:
Wahrscheinlichkeit=0,3 (30%)
Wenn W=rand(1,1) gleichverteilt Zufallszahlen ausspuckt, ist das in Fall

a) eine 0,5 und in b) eine 0,1

Dann wird in Fall a) deine Schleife "es passiert was anderes" machen, in Fall b) passiert "wird ausgeführt"

Wenn das jetzt mehrfach passiert, wird die if Bedingung 30% treffen und die else Bedingung eben die übrigen 70% der Aufrufe.
Soweit jetzt verstanden?

Wenn du Verständnisproblem hast, empfehle ich es einfach mit ganz simplen Zahlen auszuprobieren, oder eben auf einem Blatt Papier mal den Code "durchzuarbeiten".
_________________

Wenn ich bei der Arbeit mit Computern eins gelernt habe dann das ich einem Computer nur soweit traue wie ich ihn werfen kann.
Private Nachricht senden Benutzer-Profile anzeigen
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 12.08.2008, 19:41     Titel:
  Antworten mit Zitat      
Eine Ergänzung zu steffis Beispiel:
Würdest Du die Zufallswahrscheinlichkeit über ein == mit dem Eingabewert vergleichen, wäre es tatsächlich egal, welchen Wert Du als Schwellwert angibst.

Da Du aber über ein <= vergleichst, ändert sich die Situation grundlegend.
Nimm beispielsweise einen sechsseitigen Würfel.

Die Wahrscheinlichkeit, genau die 2 zu erhalten ist natürlich so hoch wie die, eine fünf zu erhalten.
Möchtest Du aber eine beliebige Zahl kleiner oder gleich 2 würfeln, dann ist die Wahrscheinlichkeit kleiner als wenn Du eine beliebige Zahl kleiner oder gleich 5 würfeln möchtest, da die Anzahl der Elemente kleiner ist, die Wahrscheinlichkeit pro Element aber gleich hoch:
kleiner oder gleich 2: 1, 2
kleiner oder gleich 5: 1, 2, 3, 4, 5
Jede der Zahlen hat bei einem sechsseitigen Würfel die Wahrscheinlichkeit von 1/6, gewürfelt zu werden, also hast Du im ersten Fall eine Gesamtwahrscheinlichkeit von 2/6 = 1/3, im zweiten Fall von 5/6.
Diese Überlegung kannst Du jetzt auf eine Menge mit 10 Elemente, 100 Elementen, 1 Million Elemente, etc. übertragen.
Daher ist der Schwellwert auf jeden Fall ausschlaggebend.

Noch ein Nachtrag:
Im statistischen Mittel (also für viele Durchläufe Deines Programms) wirst Du bei einem Schwellwert von 0.3 auch wirklich in 3 von 10 Fällen die spezielle Funktion aufgerufen haben. Wenn Du sie nur exakt 10 Mal laufen lässt, kann das durchaus anders aussehen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Chrisch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 09.06.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.08.2008, 19:28     Titel:
  Antworten mit Zitat      
wunderbare Erklärung !
Hatte da einen kleinen Denkfehler drin.
Danke.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
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.