2. óra

2. óra: Véletlenszám generálás és eloszlások (python verzió)

A python általános célű programnyelv, nem csak matematikai műveletek végrehajtására készült, ezért alapból nem tartalmaz megfelelő függvényeket és kiegészítőket.

Sok hasznos modul elérhető hozzá, amiket be kell importálni használat előtt:

In [30]:
import numpy as np  # Matematikai számításokhoz használt függvények és adatstruktúrák a numpy modulból
import matplotlib.pyplot as plt  # Ábrák készítéséhez használható függvények
%matplotlib nbagg  # ne külön ablakba rajzolja ki (ha hibát ír ki akkor 'nbagg' helyett 'inline' vagy 'notebook' szót írni)

Így generálhatunk számsorozatot 0-tól 99-ig 1-es lépésközzel és irathatjuk ki a kapott tömb alakját:

In [84]:
x = np.arange(100)
print 'x alakja:', x.shape  # Így irhatunk ki dolgokat a képernyőre
x alakja: (100,)

Véletlenszám generálás a [0, 1) intervallumon:

In [85]:
w = np.random.rand(100)
print 'w alakja: ', w.shape
w alakja:  (100,)

A 100 random szám kiplottolása:

In [86]:
plt.figure()
plt.plot(x, w)
Out[86]:
[<matplotlib.lines.Line2D at 0x7f781576c8d0>]

A számok összege és a becsült várhatóérték kirajzolása egy ábrára subplotok használatával:

In [88]:
plt.figure()

plt.subplot(121)
plt.plot(x+1, w.cumsum())

plt.subplot(122)
plt.plot(x+1, w.cumsum() / (x+1))

plt.tight_layout()

A becsült szórás függése a mintaszámtól:

In [89]:
plt.figure()
plt.plot(np.sqrt(np.cumsum((w-0.5)**2) / (x+1)))
Out[89]:
[<matplotlib.lines.Line2D at 0x7f7814ce9150>]

Hisztogram készítése:

In [28]:
plt.figure()
(n, bins, patches) = plt.hist(w, bins=30, normed=True)

Minta generálása normális eloszlásból:

In [33]:
w2 = np.random.normal(0, 1, size=10000)

plt.figure()
(n, bins, patches) = plt.hist(w2, bins=30, normed=True)

A normális eloszlás sűrűségfüggvényét is rá akarjuk rajzolni a hisztogramra.

A sűrűségfüggvény képlete:

$ \mathcal{N}(x | \mu, \sigma) = \frac{1}{\sqrt{2 \pi \sigma^2}} \mathrm{e}^{ \frac{ -(x-\mu)^2}{2 \sigma^2} } $

Ehhez definiálunk egy normal_pdf nevű python-függvényt, ami visszaadja minden bemenethez a sűrűségfüggvény értékét:

In [34]:
def normal_pdf(x, mu, sigma):
    return 1./np.sqrt(2 * np.pi * sigma**2) * np.exp(-(x-mu)**2 / (2*sigma**2))
In [40]:
x2 = np.arange(-10, 10, 0.1)  # Létrehozunk egy változót a kiszámolandó helyekkel
y = normal_pdf(x2, mu=0., sigma=1.)  # Itt számoljuk ki a sűrűségfüggvény értékét minden x2 helyen

plt.figure()
(n, bins, patches) = plt.hist(w2, bins=30, normed=True, alpha=0.5)
plt.plot(x2, y, 'r-', linewidth=2.)
Out[40]:
[<matplotlib.lines.Line2D at 0x7f781e152d50>]

Több minta generálása uniform eloszlásból:

In [70]:
w4 = np.random.random(10000)

plt.figure()
(n, bins, patches) = plt.hist(w4, bins=30, normed=True)

Két uniform eloszlású valószínűségi változó átlagának eloszlása:

In [91]:
w42 = np.random.rand(10000, 2)
plt.figure()
(n, bins, patches) = plt.hist(w42.sum(axis=1)/2., bins=30, normed=True)

Tíz uniform eloszlású valószínűségi változó átlagának eloszlása:

In [45]:
w410 = np.random.rand(10000, 10)
plt.figure()
(n, bins, patches) = plt.hist(w410.sum(axis=1)/10., bins=30, normed=True)

Eloszlások

A scipy.stats modulban több eloszlásfüggvény és sűrűségfüggvény is implementálva van, ezért beimportáljuk.

https://docs.scipy.org/doc/scipy-0.18.1/reference/stats.html

In [46]:
import scipy.stats as spt

A normális és a lognormális eloszlás

In [60]:
x2 = np.arange(-10, 10, 0.1)
x3 = np.arange(0.01, 10, 0.05)

normal = spt.norm.pdf(x2, 0, 1)
lognormal = spt.lognorm.pdf(x3, s=1)

plt.figure()

plt.subplot(121)
plt.plot(x2, normal, linewidth=2.)

plt.subplot(122)
plt.plot(x3, lognormal, linewidth=2.)

plt.tight_layout()
In [52]:
 
In [ ]: