Afin de comprendre la relation entre les distributions de probabilité, nous avons implémenté et résumé des fonctions qui génèrent diverses distributions de probabilité en Python, à partir de la distribution de Bernoulli. Cet article s'adresse aux personnes suivantes.
Les fonctions Python implémentées sont les suivantes. Les noms de fonction incluent «bernolli» et «binom».
Par exemple, une distribution uniforme peut être générée en suivant l'ordre suivant.
Distribution de Bernouy-> Distribution géométrique-> Distribution exponentielle-> Distribution gamma-> Distribution bêta-> Distribution uniforme
La définition du nom de la fonction et de la distribution de probabilité suit scipy.stats.
Maintenant, expliquons chaque fonction tour à tour.
Tout d'abord, générez un échantillon qui suit la distribution de Bernoulli du point de départ. La distribution de Bernoulli est une distribution de probabilité qui suit "le nombre de gains lorsque la loterie $ p $ est tirée une fois". Comme vous pouvez le voir dans la définition, les valeurs possibles sont 0 ou 1. La fonction stochastique est donnée par l'équation suivante.
f(x;p) = p^x (1-p)^{1-x}\ \ (x=0,1)
Passez à l'implémentation Python. Importez numpy et scipy.stats à l'avance.
import numpy as np
from scipy import stats
Vous trouverez ci-dessous une fonction qui génère des échantillons sampleSize qui suivent la distribution de Bernoulli avec une probabilité de $ p $.
def bernoulli(p, sampleSize):
return stats.bernoulli.rvs(p, size=sampleSize)
Essayons de générer 20 échantillons à partir de cette fonction.
bernoulli(0.2, 20)
> array([1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1])
Selon le réglage, 1 apparaît avec une probabilité d'environ 0,2.
C'est la dernière fois que vous utilisez scipy.stats, et après cela, une distribution de probabilité sera générée sur la base de cette fonction bernoulli
.
La distribution binomiale est une distribution de probabilité qui suit "le nombre de gains lorsque la loterie avec une chance de gagner $ p $ est tirée $ n $ fois". La fonction stochastique est donnée par l'équation suivante.
f(x;n,p) = \left(
\begin{matrix}
n\\
x
\end{matrix}
\right) p^x(1-p)^{n-x}\ \ (x=0,1,\cdots,n)
La distribution binomiale est le «nombre de tirages de loterie» dans la distribution de Bernoulli multiplié par $ n $. sampleSize "Les échantillons générés à partir d'une distribution binaire avec $ n $ nombre d'essais et $ p $ probabilité" sont créés à partir de $ n \ fois $ sampleSize "échantillons générés à partir de la distribution de Bernoulli avec $ p $ probabilité" peut faire. La mise en œuvre est comme ci-dessous.
def binom(n, p, sampleSize):
x = bernoulli(p, n * sampleSize)
x = x.reshape([n, sampleSize])
return np.sum(x, axis=0)
La distribution de Poisson est une distribution de probabilité qui suit "le nombre de gains par unité de temps dans une loterie qui gagne $ \ mu $ par unité de temps". La fonction stochastique est donnée par l'équation suivante.
f(x;\mu) = \frac{\mu^x}{x!}\exp(-\mu)\ \ (x=0,1,\cdots)
Comme vous pouvez le voir ci-dessous, la distribution de Poisson est très similaire à la distribution binomiale.
Distribution binaire | Distribution de Poisson | |
---|---|---|
Que vois-tu | Nombre de visites | Nombre de visites |
Sous quelles conditions | Nombre constant d'essais | Temps constant |
Si $ n $ dans la distribution binomiale avec $ n $ nombre d'essais et $ \ frac {\ mu} {n} $ est $ n \ vers \ infty $, il convergera vers une distribution de Poisson avec une moyenne de $ \ mu $. La mise en œuvre est comme ci-dessous.
def poisson(mu, sampleSize):
n = 1000 #Nombre assez grand
p = mu / n
return binom(n, p, sampleSize)
Plus $ n $ est grand, mieux c'est, mais cela augmentera la quantité de calcul.
Les échantillons qui suivent la distribution de Poisson ont été générés à partir de la fonction binom
. La fonction binom
est basée sur la fonction bernoulli
. En d'autres termes, nous avons généré la distribution de Poisson à partir de la distribution de Bernoulli. Nous continuerons d'utiliser cette méthode à l'avenir.
La distribution géométrique est une distribution de probabilité qui suit "le nombre d'essais où la probabilité de gagner est tirée jusqu'à ce que la loterie de $ p $ soit gagnée". La fonction stochastique est donnée par l'équation suivante.
f(x;p)= p(1-p)^{x-1}\ \ (x=1,2,\cdots)
Les échantillons générés à partir d'une distribution géométrique avec une probabilité de $ p $ peuvent être faits à partir d'une distribution de Bernoulli avec une probabilité de $ p $. La mise en œuvre est comme ci-dessous.
def geom(p, sampleSize):
x = []
for _ in range(sampleSize):
t = 1
while bernoulli(1 - p, 1):
t += 1
x.append(t)
return np.array(x)
def geom(p, sampleSize):
n = 1000
x = []
s = np.array([-1], dtype=int)
while len(x) < sampleSize:
x_ = bernoulli(p, n) #Générez simultanément n échantillons qui suivent la distribution de Bernoulli.
x_ = np.where(x_ == 1)[0]
x_ = np.concatenate([s, x_])
x.extend(x_[1:] - x_[:-1])
s = np.array([x_[-1] - n])
return np.array(x[:sampleSize])
Les deux fonctions font la même chose, mais je pense que la première est plus facile à comprendre et la seconde est plus rapide.
La distribution binomiale négative est une distribution de probabilité qui suit "le nombre d'échecs lorsque la loterie avec une probabilité de gain de $ p $ est tirée jusqu'à ce qu'elle gagne $ n $ fois". La fonction stochastique est donnée par l'équation suivante.
f(x;n,p) = \left(
\begin{matrix}
n+x-1\\
x
\end{matrix}
\right) p^n(1-p)^{x}\ \ (x=0,1,\cdots,n)
La seule différence essentielle avec la distribution géométrique est "combien de fois vous gagnez à la loterie". Comme indiqué ci-dessous, une distribution binomiale négative peut être créée à partir d'une distribution géométrique.
def nbinom(n, p, sampleSize):
x = geom(p, sampleSize * n) - 1
x = x.reshape([sampleSize, n])
return np.sum(x, axis=1)
La distribution exponentielle est une distribution de probabilité qui suit "le temps qu'il faut pour gagner un gain à une loterie qui gagne $ \ frac {1} {\ lambda} $ par unité de temps en moyenne". La fonction de densité de probabilité est donnée par l'équation suivante.
f(x,\lambda) = \lambda\exp(-\lambda x)
La distribution exponentielle est très similaire à la distribution géométrique comme suit.
Distribution géométrique | Distribution exponentielle | |
---|---|---|
Que vois-tu | Nombre d'essais jusqu'à un coup | Il est temps d'en avoir un |
Quel genre de loterie? | La probabilité de gagner pour chaque essai est constante | Le nombre moyen de hits par unité de temps est constant |
La propriété selon laquelle la probabilité de succès ne change pas indépendamment du temps ou de l'essai est appelée ** absence de mémoire **. Les distributions géométriques et exponentielles ont cette propriété. Vous pouvez créer une distribution exponentielle en définissant $ p \ to0 $ dans la distribution géométrique.
def expon(lam, sampleSize):
p = 0.01 #Assez petit
x = geom(p, sampleSize)
return x * p * lam
Plus $ p $ est petit, mieux c'est, mais cela augmentera la quantité de calcul.
Les distributions de Poisson peuvent être créées à partir de distributions exponentielles ainsi que de distributions binomiales. La diapositive de La mauvaise relation entre la distribution exponentielle et la distribution de Poisson est très facile à comprendre. La diapositive montre l'implémentation R, mais voici l'implémentation Python.
def poisson_(mu, sampleSize):
x = []
while len(x) < sampleSize:
t = 0
n = -1
while t <= 1:
t += expon(1 / mu, 1)
n += 1
x.append(n)
return np.array(x)
La distribution gamma est une distribution de probabilité qui suit "le temps qu'il faut pour gagner $ \ alpha $ fois dans une loterie qui fait en moyenne $ \ frac {1} {\ lambda} $ par unité de temps". La fonction de densité de probabilité est donnée par l'équation suivante.
f(x;\alpha,\lambda)=\frac{\lambda^\alpha}{\Gamma(\alpha)}x^{\alpha-1}\exp(-\lambda x)\ \ (x\ge0)
Cependant, $ \ Gamma (\ alpha) $ est donné par la formule suivante.
\Gamma(\alpha)=\int_0^\infty t^{\alpha-1}\exp(-t)dt
La seule différence essentielle par rapport à la distribution exponentielle est "combien de hits voulez-vous voir?" La distribution gamma peut être faite à partir d'une distribution exponentielle.
def gamma(alpha, lam, sampleSize):
x = expon(lam, sampleSize * alpha)
x = x.reshape([sampleSize, alpha])
return np.sum(x, axis=1)
L'argument $ \ alpha $ de la fonction gamma
ci-dessus doit être un nombre naturel. Tout est OK tant que $ \ alpha $ de la distribution gamma générale est un nombre positif, mais s'il s'agit de $ \ alpha $ autre qu'un nombre naturel, il ne peut pas être créé à partir de la distribution de Bernoulli et c'est difficile à expliquer, je vais donc le limiter aux nombres naturels ici. fait.
La distribution gamma peut également être créée à partir d'une distribution binomiale négative. La distribution gamma et la distribution binomiale négative sont très similaires comme suit.
Distribution binomiale négative | Distribution gamma | |
---|---|---|
Que vois-tu | ||
Quel genre de loterie? | La probabilité de gagner pour chaque essai est constante | Le nombre moyen de hits par unité de temps est constant |
Créer une distribution gamma à partir d'une distribution binomiale négative revient exactement à créer une distribution exponentielle à partir d'une distribution géométrique.
def gamma_(alpha, lam, sampleSize):
p = 0.01 #Assez petit
x = nbinom(alpha, p, sampleSize)
return x * p * lam
Encore une fois, l'argument $ \ alpha $ doit être un nombre naturel.
Toute distribution peut être ajoutée à l'infini à une distribution normale (limitation du pôle central). Il y a un exemple dans mon premier article "Vérification de la nature apocalyptique de la distribution de probabilité en Python". La distribution binomiale était la somme de $ n $ de la distribution de Bernoulli. La distribution binomiale suit une distribution normale en définissant $ n \ sur \ infty $. La fonction de densité de probabilité de la distribution normale avec moyenne $ \ mu $ et variance $ \ sigma ^ 2 $ est donnée par l'équation suivante.
f(x;\mu,\sigma^2)=\frac{1}{\sqrt{2\pi\sigma^2}}\exp\biggl\{-\frac{(x-\mu)^2}{2\sigma^2}\biggr\}
Les échantillons qui suivent une distribution normale avec une moyenne $ \ mu $ et un écart-type $ \ sigma $ peuvent être générés de la manière suivante:
def norm(mu, sigma, sampleSize):
n = 1000 #Nombre assez grand
p = 0.5
x = binom(n, p, sampleSize)
sd = (n * p * (1 - p)) ** 0.5
x = (x - n * p) / sd * sigma + mu
return x
Je ne peux pas l'expliquer comme une loterie, mais la distribution $ \ chi ^ 2 $ apparaît souvent dans les tests d'hypothèses. Lorsque $ X_1, X_2, \ cdots, X_ {df} $ suivent indépendamment la distribution normale standard (distribution normale avec moyenne 0, variance 1), $ X_1 ^ 2 + X_2 ^ 2 + \ cdots + X_ {df} ^ 2 $ s'appelle la distribution $ \ chi ^ 2 $ avec $ df $ de liberté. La mise en œuvre est comme ci-dessous.
def chi2(df, sampleSize):
x = norm(0, 1, sampleSize * df) ** 2
x = x.reshape([sampleSize, df])
return np.sum(x, axis=1)
Encore une fois, je ne peux pas l'expliquer comme une loterie, mais la distribution $ \ chi ^ 2 $ avec 1 degré de liberté correspond à la distribution gamma avec $ \ alpha = 1/2 $ et $ \ lambda = 1/2 $. Grâce à la propriété ** regénération ** de la distribution gamma, il est possible de générer une distribution gamma lorsque $ \ alpha $ est $ n $ fois ($ n $ est un nombre naturel) de $ \ frac {1} {2} $. La reproductibilité sera expliquée à la fin.
def gamma__(alpha, lam, sampleSize):
df = int(np.round(alpha * 2))
x = chi2(1, sampleSize * df)
x = x.reshape([sampleSize, df])
x = x * lam / 2
return np.sum(x, axis=1)
L'argument $ \ alpha $ de cette fonction doit être $ n $ fois ($ n $ est un nombre naturel) de $ \ frac {1} {2} $.
Cela ne peut pas être expliqué comme une loterie, mais les paramètres sont basés sur la "distribution gamma avec les paramètres $ (\ alpha, \ lambda) $" et la "distribution gamma avec les paramètres $ (\ beta, \ lambda) $". Peut générer une distribution bêta de $ (\ alpha, \ beta) $. La fonction de densité de la distribution bêta est donnée par l'équation suivante.
f(x;\alpha,\beta)=x^{\alpha-1}(1-x)^{\beta-1}\ \ (0\le x\le 1)
La plage allant de 0 à 1, elle est souvent utilisée comme distribution préalable de paramètres qui représentent la probabilité dans les statistiques bayésiennes.
def beta(alpha, beta, sampleSize):
x1 = gamma(alpha, 1, sampleSize)
x2 = gamma(beta, 1, sampleSize)
return x1 / (x1 + x2)
Comme il ressort de la fonction de densité de la distribution bêta, si $ \ alpha, \ beta = 1 $, la distribution bêta correspond à la distribution uniforme. Les échantillons qui suivent une distribution uniforme peuvent être réalisés à partir d'une distribution bêta.
def uniform(sampleSize):
return beta(1, 1, sampleSize)
La relation entre eux est claire en un coup d'œil.
Parlons maintenant de ** jouabilité **. La reproductibilité est la capacité de remplacer l'ajout de distributions par l'ajout de paramètres. Par exemple
Alors $ X + Y $ suit une distribution binomiale avec $ (n + m) $ essais et $ p $ probabilité. Puisque 1. est égal à la somme des distributions $ n $ Bernoulli et 2. est égal à la somme des distributions $ m $ Bernoulli, $ X + Y $ est la somme des distributions $ (n + m) $ Bernoulli. Autrement dit, le nombre d'essais correspond à la distribution binomiale de $ (n + m) $. Selon la même théorie, la distribution à l'extrémité de la flèche de «pluralisation» dans la figure ci-dessus a toujours la propriété de reproductibilité (distribution binaire, distribution binomiale négative, distribution gamma, distribution $ \ chi ^ 2 $). Et, bien sûr, la distribution normale et la distribution de Poisson, qui sont les limites de la distribution binomiale, sont également reproductibles.
Essayez Distribution de Bernouy-> Distribution géométrique-> Distribution exponentielle-> Distribution gamma-> Distribution bêta-> Distribution uniforme-> Distribution de Bernoulli
.
Définissez à l'avance la fonction de traçage.
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style='whitegrid')
def plot_descreteDitribution(sample, truePf, xmin, xmax):
sampleSize = len(sample)
x = np.arange(xmin, xmax + 1)
pf = np.array([np.sum(sample == i) for i in x]) / sampleSize #Distribution obtenue par expérience
#Tracez la distribution obtenue dans l'expérience en bleu
plt.plot(x - 0.1, pf, 'bo', ms=8)
plt.vlines(x - 0.1, 0, pf, colors='b', lw=5, alpha=0.5)
#Tracez la vraie distribution en rouge
plt.plot(x + 0.1, truePf(x), 'ro', ms=8)
plt.vlines(x + 0.1, 0, truePf(x), colors='r', lw=5, alpha=0.5)
def plot_continuousDitribution(sample, truePf, xmin, xmax):
sampleSize = len(sample)
x = np.linspace(xmin, xmax, 100)
#Tracez la distribution obtenue dans l'expérience en bleu
th = np.linspace(xmin, xmax, 30)
hi = np.array([np.sum(np.logical_and(th[i] < sample, sample <= th[i + 1])) for i in range(30 - 1)]) / (sampleSize * (th[1] - th[0]))
plt.bar((th[:-1] + th[1:]) / 2, hi, width=(th[1] - th[0]))
#Tracez la vraie distribution en rouge
plt.plot(x, truePf(x), 'r', linewidth=4)
plt.xlim(xmin, xmax)
p = 0.2
xmin = 1
xmax = 20
sample = geom(p, sampleSize)
truePf = lambda x: stats.geom.pmf(x, p)
plot_descreteDitribution(sample, truePf, xmin, xmax)
--Résultat
Le rouge est la distribution créée par scipy.stats et le bleu est la distribution créée à partir de la fonction créée cette fois. La valeur sampleSize a été définie sur 10000. Il en va de même par la suite.
lam = 2
xmin = 0
xmax = 10
sample = expon(lam, sampleSize)
truePf = lambda x: stats.expon.pdf(x, scale=lam)
plot_continuousDitribution(sample, truePf, xmin, xmax)
--Résultat
alpha = 3
lam = 2
xmin = 0
xmax = 20
sample = gamma(alpha, lam, sampleSize)
truePf = lambda x: stats.gamma.pdf(x, alpha, scale=lam)
plot_continuousDitribution(sample, truePf, xmin, xmax)
--Résultat
alpha = 3
bet = 2
xmin = 0
xmax = 1
sample = beta(alpha, bet, sampleSize)
truePf = lambda x: stats.beta.pdf(x, alpha, bet)
plot_continuousDitribution(sample, truePf, xmin, xmax)
--Résultat
xmin = 0
xmax = 1
sample = uniform(sampleSize)
truePf = lambda x: stats.uniform.pdf(x)
plot_continuousDitribution(sample, truePf, xmin, xmax)
--Résultat
p = 0.2
xmin = -2
xmax = 4
def bernoulli_(p, sampleSize):
x = uniform(sampleSize)
return (x < p).astype(int)
sample = bernoulli_(p, sampleSize)
truePf = lambda x: stats.bernoulli.pmf(x, p)
plot_descreteDitribution(sample, truePf, xmin, xmax)
--Résultat
Vous pouvez voir que cela a fonctionné.