In supergeometrischer Verteilung
Andererseits in der Binomialverteilung
Die hypergeometrische Verteilung kann durch eine Binomialverteilung gut angenähert werden, wenn die Gesamtzahl (die Anzahl der Kugeln in der Schachtel) ausreichend größer als die Anzahl der Extrakte ist.
Die Binomialverteilung ist
import scipy as sc
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
# functions ------------------------
def binomial(n, x, p):
'''
Binäre Verteilung
Ereignisse mit der Wahrscheinlichkeit p treten in n Versuchen x-mal auf
Jeder Versuch ist unabhängig
Beispiel: Ein Ereignis, das 3 auf einen Würfel gibt (Wahrscheinlichkeit p)=1/6) aber n Würfel=X beim 10-maligen Schütteln=5 mal)
nCx * p^x * (1-p)^(n-x)
'''
return (
sc.special.comb(n, x)
* np.power(p, x)
* np.power(1 - p, n - x)
)
def poisson(n, x, p):
'''
Poisson-Verteilung
p->Bei 0 wird die Binomialverteilung zu einer Poisson-Verteilung.
'''
mean = n * p
return (
np.power(mean, x)
* np.exp(-mean)
/ sc.special.factorial(x)
)
def gaussian(n, x, p):
'''
Normalverteilung
n->Wenn oo, wird die Binomialverteilung zu einer Normalverteilung
'''
mean = n * p
variance = np.power(n * p * (1 - p), 1/2)
return (
1.0
/ (np.power(2 * np.pi, 1/2) * variance)
/ np.exp(
np.power(x - mean, 2)
/ (2 * np.power(variance, 2))
)
)
def hypergeometric(n, x, p, N):
'''
Super geometrische Verteilung
Jeder Versuch ist nicht unabhängig
Es ist notwendig, alle N für die nicht wiederherstellende Extraktion zu berücksichtigen
'''
target_size = N * p #Anzahl der Treffer im Ganzen
return (
sc.special.comb(target_size, x) #X Kombinationen pro
* sc.special.comb(N - target_size, n - x) #Verloren n-x Kombinationen
/ sc.special.comb(N, n) #Alle Kombinationen von n
)
def calc_distributions(n, p, cols, N=0):
'''
ex.:
n = 30 #Anzahl von Versuchen
p = 0.16 #Prozentsatz der Treffer
N = 1000 #Alle (nur in der supergeometrischen Verteilung verwendet)
'''
#Bereiten Sie ein Array zum Speichern der Ergebnisse vor
bi_arr = np.zeros(n + 1, dtype=np.float)
po_arr = np.zeros(n + 1, dtype=np.float)
ga_arr = np.zeros(n + 1, dtype=np.float)
for x in np.arange(n + 1):
#Speichern Sie die Ergebnisse in einem Array
bi_arr[x] = binomial(n, x, p)
po_arr[x] = poisson(n, x, p)
ga_arr[x] = gaussian(n, x, p)
#Speichern Sie das Ergebnis in einem Datenrahmen
df = pd.DataFrame()
df['Binäre Verteilung'] = bi_arr
df['Poisson-Verteilung'] = po_arr
df['Normalverteilung'] = ga_arr
if N > 0:
hy_arr = np.zeros(n + 1, dtype=np.float)
for x in np.arange(n + 1):
hy_arr[x] = hypergeometric(n, x, p, N)
df['Super geometrische Verteilung'] = hy_arr
return df[cols]
def visualize(df,n, p, N=0):
plot_params = {
'linestyle':'-',
'markersize':5,
'marker':'o'
}
colors = [
'black',
'blue',
'green',
'purple',
]
plt.close(1)
figure_ = plt.figure(1, figsize=(8,4))
axes_ = figure_.add_subplot(111) #Achsen erstellen
for i, col in enumerate(df.columns):
if i == 0:
plot_params['linewidth'] = 2
plot_params['alpha'] = 1.0
else:
plot_params['linewidth'] = 1
plot_params['alpha'] = 0.4
plot_params['color'] = colors[i]
axes_.plot(
df.index.values, df[col].values,
label = col,
**plot_params,
)
plt.legend()
plt.xlabel('Anzahl der Treffer x')
plt.ylabel('Wahrscheinlichkeit, x mal n mal zu gewinnen')
title = 'Prozentsatz der Treffer p:{p:.2f},Anzahl der Versuche n:{n}'.format(p=p, n=n)
if 'Super geometrische Verteilung' in df.columns:
title += ',Alle n:{N}'.format(N=N)
plt.title(title)
xmax = n * p * 2
if xmax<10: xmax = 10;
plt.xlim([0, xmax])
#(Der Ausdruck "Anzahl der Male" ist nicht gut, wenn man die Extraktion ohne Restauration berücksichtigt.)
n = 100; p = 0.167
df = calc_distributions(n, p, cols=['Binäre Verteilung', 'Poisson-Verteilung', 'Normalverteilung'])
visualize(df, n, p)
Binärverteilung und Normalverteilung stimmen gut überein
n = 100; p = 0.01
df = calc_distributions(n, p, cols=['Binäre Verteilung', 'Poisson-Verteilung', 'Normalverteilung'])
visualize(df, n, p)
Binärverteilung und Poisson-Verteilung stimmen gut überein
n = 100; p = 0.1; N = 5000
df = calc_distributions(n, p, cols=['Super geometrische Verteilung','Binäre Verteilung'], N=N)
visualize(df, n, p, N)
Supergeometrische Verteilung und Binomialverteilung stimmen gut überein
n = 100; p = 0.1; N = 500
df = calc_distributions(n, p, cols=['Super geometrische Verteilung','Binäre Verteilung'], N=N)
visualize(df, n, p, N)
Der Fehler ist im Vergleich zu N = 5000 erkennbar
Ende
Recommended Posts