Skip to content
Snippets Groups Projects
Commit adc0e3f9 authored by Konrad Völkel's avatar Konrad Völkel
Browse files

Experiment mit Widgets

parent e27bfd10
Branches
No related tags found
No related merge requests found
Pipeline #150387 passed
%% Cell type:markdown id:04598fd5-c190-479e-a252-457a3ed02c52 tags: %% Cell type:markdown id:04598fd5-c190-479e-a252-457a3ed02c52 tags:
# Stochastik programmieren # Stochastik programmieren
%% Cell type:markdown id:9b4163a3-d84b-42ec-b927-6888e3bc159b tags: %% Cell type:markdown id:9b4163a3-d84b-42ec-b927-6888e3bc159b tags:
Wir wollen uns nun kurz damit beschäftigen, wie sich mit Python Stichproben von Zufallsexperimenten simulieren lassen. Wir wollen uns nun kurz damit beschäftigen, wie sich mit Python Stichproben (en. Samples) von Zufallsexperimenten simulieren lassen.
Verwendete Python-Konstrukte: [Module/import](https://docs.python.org/3/tutorial/modules.html), [Methoden/def](https://docs.python.org/3/tutorial/controlflow.html#defining-functions), [Länge/len](https://docs.python.org/3/library/functions.html#len), [Mengen/set](https://docs.python.org/3/tutorial/datastructures.html#sets), [Generator-Ausdruck](https://docs.python.org/3/tutorial/classes.html#generator-expressions), [Range](https://docs.python.org/3/tutorial/controlflow.html#the-range-function), [Assertion/assert](https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement)
## Wahrscheinlichkeitsmaß implementieren ## Wahrscheinlichkeitsmaß implementieren
%% Cell type:code id:1b9aa059-0486-4d8b-aff3-37a5f9cbb5d8 tags: %% Cell type:code id:1b9aa059-0486-4d8b-aff3-37a5f9cbb5d8 tags:
``` python ``` python
from fractions import Fraction from fractions import Fraction
def P(A, Omega): def P(A, Omega):
"""Die Wahrscheinlichkeit für das Ereignis A, """Die Wahrscheinlichkeit für das Ereignis A,
gegeben gleich wahrscheinliche Ergebnisse aus einem Ergebnisraum Ω.""" gegeben gleich wahrscheinliche Ergebnisse aus einem Ergebnisraum Ω."""
return Fraction(len(A & Omega), len(Omega)) return Fraction(len(A and Omega), len(Omega))
``` ```
%% Cell type:markdown id:2080149c-7800-4728-acb3-579a89f46971 tags: %% Cell type:markdown id:2080149c-7800-4728-acb3-579a89f46971 tags:
Wir werden damit nun einen Würfelwurf programmieren: Wir werden damit nun einen Würfelwurf programmieren:
%% Cell type:code id:a03a347d-86fb-4098-98ba-c7c1cd3ed715 tags: %% Cell type:code id:a03a347d-86fb-4098-98ba-c7c1cd3ed715 tags:
``` python ``` python
W = {1, 2, 3, 4, 5, 6} W = {1, 2, 3, 4, 5, 6}
gerade = set((x*2 for x in range(1,4))) gerade = set((x*2 for x in range(1,4)))
print("Gerade Würfelaugen:",gerade) print("Gerade Würfelaugen:",gerade)
print("Wahrscheinlichkeit für gerade Augenzahl:", P(gerade, W)) print("Wahrscheinlichkeit für gerade Augenzahl:", P(gerade, W))
``` ```
%% Output %% Output
Gerade Würfelaugen: {2, 4, 6} Gerade Würfelaugen: {2, 4, 6}
Wahrscheinlichkeit für gerade Augenzahl: 1/2 Wahrscheinlichkeit für gerade Augenzahl: 1/2
%% Cell type:markdown id:1a17807c-4adb-4482-8836-1a892b6af8d6 tags: %% Cell type:markdown id:1a17807c-4adb-4482-8836-1a892b6af8d6 tags:
Damit haben wir nun das Wahrscheinlichkeitsmaß. Wenn wir eine Stichprobe ziehen wollen, müssen wir noch irgendwo den "Zufall" her bekommen. Damit haben wir nun das Wahrscheinlichkeitsmaß. Wenn wir eine Stichprobe ziehen wollen, müssen wir noch irgendwo den "Zufall" her bekommen.
## Zufall importieren ## Zufall importieren
Python bietet mit dem `random`-Modul eine Schnittstelle zu Pseudozufallszahlen. Die Methode `random.random` ist ein direkt in C implementierter Mersenne Twister. Wenn man "echte" Zufallszahlen braucht, etwa für kryptografische Zwecke, gibt es dazu das `secrets`-Modul. Den Seed für den Mersenne Twister kann man angeben, und sollte man auch, um Zufallssimulationen reproduzierbar zu machen. Python bietet mit dem `random`-Modul eine Schnittstelle zu Pseudozufallszahlen. Die Methode `random.random` ist ein direkt in C implementierter [Mersenne Twister](https://de.wikipedia.org/wiki/Mersenne-Twister). Wenn man "echte" Zufallszahlen braucht, etwa für kryptografische Zwecke, gibt es dazu das `secrets`-Modul. Den Seed für den Mersenne Twister kann man angeben, und sollte man auch, um Zufallssimulationen reproduzierbar zu machen.
%% Cell type:code id:05a3b6f7-e7b6-4034-b3f9-807b20b47d6c tags: %% Cell type:code id:05a3b6f7-e7b6-4034-b3f9-807b20b47d6c tags:
``` python ``` python
from random import random as r from random import random as r
help(r) help(r)
print(r()) print(r())
import random import random
random.seed(1) random.seed(1)
very_random = r() very_random = r()
print(very_random) print(very_random)
assert very_random == 0.13436424411240122 assert very_random == 0.13436424411240122
``` ```
%% Output %% Output
Help on built-in function random: Help on built-in function random:
random() method of random.Random instance random() method of random.Random instance
random() -> x in the interval [0, 1). random() -> x in the interval [0, 1).
0.7803255204450154 0.5311158584902383
0.13436424411240122 0.13436424411240122
%% Cell type:markdown id:c862bd54-0c4f-4100-8654-4e86a6e3d3e1 tags: %% Cell type:markdown id:c862bd54-0c4f-4100-8654-4e86a6e3d3e1 tags:
![XKCD 221: Random Number](images/random_number.png "RFC 1149.5 specifies 4 as the standard IEEE-vetted random number.") ![XKCD 221: Random Number](images/random_number.png "RFC 1149.5 specifies 4 as the standard IEEE-vetted random number.")
[Link zum Comic (Randall Munroe, CC-BY-NC 2.5)](https://xkcd.com/221) [Link zum Comic (Randall Munroe, CC-BY-NC 2.5)](https://xkcd.com/221)
Aus einer (Pseudo)zufallszahl zwischen $0$ und $1$ (man beachte: evtl. $0$ aber nie $1$) lassen sich zufällige Würfelwürfe erzeugen: Aus einer (Pseudo)zufallszahl zwischen $0$ und $1$ (man beachte: evtl. $0$ aber nie $1$) lassen sich zufällige Würfelwürfe erzeugen:
%% Cell type:code id:c453b1a1-9693-401c-ab9e-fb39a13c81a2 tags: %% Cell type:code id:62096c2f-6911-4c7a-b243-b8661e83ddb3 tags:
``` python ``` python
from math import floor from math import floor
def transform_unit_to_dice(x): def transform_unit_to_dice(x):
return floor(1 + 6*x) return floor(1 + 6*x)
assert list(range(1,7)) == [transform_unit_to_dice((x-1)/6) assert list(range(1,7)) == [transform_unit_to_dice((x-1)/6)
for x in range(1,7)] for x in range(1,7)]
print([transform_unit_to_dice(r()) for n in range(100)]) N = 100
würfe = [transform_unit_to_dice(r()) for n in range(N)]
print(würfe)
```
%% Output
[1, 1, 4, 2, 2, 5, 3, 2, 3, 1, 3, 3, 2, 1, 6, 4, 2, 4, 5, 1, 1, 1, 5, 1, 5, 5, 4, 2, 6, 5, 4, 2, 4, 3, 4, 2, 4, 1, 2, 6, 6, 2, 6, 2, 6, 5, 3, 2, 1, 6, 1, 5, 6, 4, 2, 6, 6, 5, 4, 3, 3, 2, 5, 3, 2, 1, 4, 2, 3, 2, 6, 6, 1, 2, 2, 6, 5, 3, 2, 5, 6, 6, 3, 6, 5, 3, 6, 2, 5, 1, 2, 6, 2, 5, 4, 6, 3, 3, 2, 6]
%% Cell type:code id:4e0195f2-cb57-4256-bc2a-18eb44c2f83b tags:
``` python
# Interaktiv: Benutzen Sie den Schieberegler und die Buttons!
# Der folgende Code ist nur zur interaktiven Interaktion da,
# wir lernen und üben in dieser Vorlesung nicht, wie man interaktive Elemente in Notebooks gestaltet.
import ipywidgets as widgets
from IPython.display import display
slider = widgets.IntSlider(value=10, max=100)
text = widgets.Label(value='')
wurfbutton = widgets.Button(
description='Würfel werfen',
tooltip='Anklicken um Würfelwürfe zu simulieren',
icon='dice'
)
seedbutton = widgets.Button(
description='Seed reset auf 1',
tooltip='Anklicken um Random Seed wieder auf 1 zu setzen',
icon='dice-one'
)
def roll_dice(_):
text.value = " ".join([str(transform_unit_to_dice(r())) for _ in range(slider.value)])
wurfbutton.on_click(roll_dice)
def seed_reset(_):
random.seed(1)
seedbutton.on_click(seed_reset)
seed_reset(None)
display(slider, wurfbutton, seedbutton, text)
``` ```
%% Output %% Output
[6, 5, 2, 3, 3, 4, 5, 1, 1, 6, 3, 5, 1, 3, 5, 2, 6, 6, 1, 1, 4, 6, 3, 2, 3, 1, 2, 3, 3, 2, 2, 2, 3, 2, 1, 6, 4, 4, 2, 6, 6, 1, 2, 5, 5, 6, 3, 5, 5, 2, 4, 6, 6, 4, 4, 1, 2, 5, 3, 2, 4, 5, 5, 3, 3, 4, 5, 4, 3, 3, 1, 1, 5, 6, 4, 3, 2, 4, 6, 5, 4, 6, 2, 4, 6, 4, 3, 2, 4, 6, 1, 5, 5, 6, 5, 5, 4, 4, 3, 1]
%% Cell type:markdown id:beac5e48-9b2d-410b-9ddd-a9898347d71b tags: %% Cell type:markdown id:beac5e48-9b2d-410b-9ddd-a9898347d71b tags:
Damit man solche Transformationen nicht andauernd programmieren muss, kann man hier auch auf `random.randint(1,6)` oder auch auf `random.choice(range(1,7))` oder `random.randrange(1,7)` zurückgreifen. Dabei ist `randint` ein Kürzel für das entsprechende `randrange` und `choice` ist etwas allgemeiner. Damit man solche Transformationen nicht andauernd programmieren muss, kann man hier auch auf `random.randint(1,6)` oder auch auf `random.choice(range(1,7))` oder `random.randrange(1,7)` zurückgreifen. Dabei ist `randint` ein Kürzel für das entsprechende `randrange` und `choice` ist etwas allgemeiner.
Wir wollen aber festhalten: gegeben eine gleichverteilte "Zufallsvariable" $X=$`random.random` mit Werten in $[0,1)$ haben wir eine Abbildung $t =$`transform_unit_to_dice` konstruiert und implementiert, die Werte in $\{1,2,3,4,5,6\}$ hat und $t(X)$ ist gleichverteilt. Die mathematische Abbildung $t$ ist eine Zufallsvariable, wir behandeln die Verknüpfung $t \circ X$ als Zufallsvariable, die den Würfel modelliert. Wir wollen aber festhalten: gegeben eine gleichverteilte "Zufallsvariable" $X=$`random.random` mit Werten in $[0,1)$ haben wir eine Abbildung $t =$`transform_unit_to_dice` konstruiert und implementiert, die Werte in $\Omega := \{1,2,3,4,5,6\}$ hat und $t(X)$ ist gleichverteilt. Die mathematische Abbildung $t \colon [0,1) \to \Omega$ ist eine Zufallsvariable, wir behandeln die [Verknüpfung](https://de.wikipedia.org/wiki/Komposition_(Mathematik)) $t \circ X$ als Zufallsvariable, die den Würfel modelliert.
Nun könnte man sich beschweren: `random.random()` nimmt gar keinen Parameter, ist also keine mathematische Abbildung von einem Definitionsbereich in die Menge $[0,1)$. Tatsächlich müssen wir uns vorstellen, dass es eine Abbildung $X \colon \Omega \to [0,1)$ ist, und auf $\Omega$ ein irgendwie geartetes Wahrscheinlichkeitsmaß definiert ist, sodass durch $X$ auf $[0,1)$ die Gleichverteilung induziert wird. Die Menge $\Omega$ spielt für uns keine konkrete Rolle - da "kommt der Zufall her" und in der Notation `random.random()` sehen wir schon, dass wir eben kein konkretes Element von $\Omega$ einsetzen, sondern pseudozufällig eins ziehen und das in $X$ einsetzen. Nun könnte man sich beschweren: `random.random()` nimmt gar keinen Parameter, ist also keine mathematische Abbildung von einem Definitionsbereich in die Menge $[0,1)$. Tatsächlich müssen wir uns vorstellen, dass es eine Abbildung $X \colon \Omega' \to [0,1)$ ist, und auf $\Omega'$ ein irgendwie geartetes Wahrscheinlichkeitsmaß definiert ist, sodass durch $X$ auf $[0,1)$ die Gleichverteilung induziert wird. Die Menge $\Omega'$ spielt für uns keine konkrete Rolle - da "kommt der Zufall her" und in der Notation `random.random()` sehen wir schon, dass wir eben kein konkretes Element von $\Omega'$ einsetzen, sondern pseudozufällig eins ziehen und das in $X$ einsetzen.
%% Cell type:markdown id:77aab03c-2b4f-4e83-bf3c-bc7b8cb3d5f4 tags: %% Cell type:markdown id:77aab03c-2b4f-4e83-bf3c-bc7b8cb3d5f4 tags:
## Größere Stichproben ## Größere Stichproben
%% Cell type:markdown id:d2571d1b-b44c-436d-a72f-f8385a1e4255 tags: %% Cell type:markdown id:d2571d1b-b44c-436d-a72f-f8385a1e4255 tags:
Die Methode `random.sample(population, k)` erlaubt es eine Stichprobe der Größe $k$ aus einer Population (einer Urne) zu ziehen - ziehen mit Zurücklegen. Für $k=1$ entspricht das einer Gleichverteilung auf der Population. Die Methode `random.sample(population, k)` erlaubt es eine Stichprobe der Größe $k$ aus einer Population (einer Urne) zu ziehen - ziehen mit Zurücklegen. Für $k=1$ entspricht das einer Gleichverteilung auf der Population.
Mit der Methode `random.choices(population, weights=None, *, cum_weights=None, k=1)` kann man das ziehen aus der Population $k$-mal sampeln (und dabei anstelle einer geeigneten Population auch Gewichte vergeben). Mit der Methode `random.choices(population, weights=None, *, cum_weights=None, k=1)` kann man das ziehen aus der Population $k$-mal sampeln (und dabei anstelle einer geeigneten Population auch Gewichte vergeben).
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment