[PYTHON] J'ai essayé de résumer la relation entre les distributions de probabilité à partir de la distribution de Bernoulli

introduction

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».

kankei1.png

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.

Distribution de Bernoulli

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.

De la distribution de Bernoulli à la distribution binomiale

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)

Distribution binaire à distribution de Poisson

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.

Distribution géométrique à partir de la distribution de Bernoulli

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.

Distribution binomiale négative à partir de la distribution géométrique

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)

De la distribution géométrique à la distribution exponentielle

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.

De la distribution exponentielle à la distribution de Poisson

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)

De la distribution exponentielle à la distribution gamma

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.

Distribution binomiale négative à distribution gamma

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 nNombre d'essais jusqu'à un coup \alphaIl est temps d'avoir un coup
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.

Distribution binaire à distribution normale

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

De la distribution normale à la distribution du chi carré

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)

Distribution gamma à partir de la distribution du chi carré

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} $.

Distribution gamma à distribution bêta

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)

Distribution bêta à une distribution uniforme

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)

Résumé

kankei2.png

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

  1. X la distribution binomiale avec $ n $ nombre d'essais et $ p $ probabilité
  2. Distribution Y-binaire avec $ m $ nombre d'essais et probabilité $ p $

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.

Enfin l'expérience Python

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)

Distribution géométrique (à partir de la distribution de Bernoulli)

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

幾何分布.png

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.

Distribution exponentielle (de la distribution de Bernoulli -> distribution géométrique)

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

指数分布.png

Distribution gamma (à partir de la distribution de Bernoulli-> Distribution géométrique-> Distribution exponentielle)

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

ガンマ分布.png

Distribution bêta (à partir de la distribution de Bernoulli-> ...-> distribution gamma)

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

ベータ分布.png

Distribution uniforme (à partir de la distribution de Bernoulli-> ...-> distribution bêta)

xmin = 0
xmax = 1

sample = uniform(sampleSize)
truePf = lambda x: stats.uniform.pdf(x)
plot_continuousDitribution(sample, truePf, xmin, xmax)

--Résultat

一様分布.png

Distribution de Bernoulli (de la distribution de Bernoulli-> ...-> distribution uniforme)! ??

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

ベルヌーイ分布.png

Vous pouvez voir que cela a fonctionné.

Les références

Recommended Posts

J'ai essayé de résumer la relation entre les distributions de probabilité à partir de la distribution de Bernoulli
J'ai essayé de résumer la commande umask
J'ai essayé de résumer la modélisation graphique.
LeetCode j'ai essayé de résumer les plus simples
J'ai essayé de détecter l'iris à partir de l'image de la caméra
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de résumer SparseMatrix
[Première API COTOHA] J'ai essayé de résumer l'ancienne histoire
J'ai essayé de résumer le code souvent utilisé dans Pandas
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
J'ai essayé de résumer les commandes souvent utilisées en entreprise
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
J'ai essayé d'énumérer les différences entre java et python
J'ai essayé de changer le script python de 2.7.11 à 3.6.0 sur Windows10
J'ai essayé d'obtenir diverses informations de l'API codeforces
J'ai essayé de résumer comment utiliser à nouveau le référentiel EPEL
J'ai essayé de résumer les langues que les débutants devraient désormais apprendre par but
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.
[Linux] J'ai essayé de résumer les commandes de confirmation des ressources
J'ai essayé de résumer les commandes utilisées par les ingénieurs débutants aujourd'hui
J'ai essayé de couper une image fixe de la vidéo
J'ai essayé de résumer la méthode de mise en œuvre fréquemment utilisée de pytest-mock
J'ai essayé de résumer la gestion des exceptions Python
[Python] J'ai essayé de résumer le type collectif (ensemble) d'une manière facile à comprendre.
J'ai essayé de résumer jusqu'à ce que je quitte la banque et devienne ingénieur
J'ai essayé de visualiser la tranche d'âge et la distribution des taux d'Atcoder
J'ai essayé de résumer moi-même le flux général jusqu'à la création de services.
J'ai essayé de reconnaître le mot de réveil
Entrée standard Python3 que j'ai essayé de résumer
J'ai essayé de résumer diverses phrases à l'aide de l'API de synthèse automatique "summpy"
J'ai essayé de résumer la manière logique de penser l'orientation objet.
J'ai essayé d'apprendre l'angle du péché et du cos avec le chainer
J'ai essayé d'estimer le rapport de circonférence π de manière probabiliste
J'ai essayé de toucher l'API COTOHA
J'ai essayé de résumer les commandes Linux utilisées par les ingénieurs débutants aujourd'hui - Partie 1-
J'ai essayé de résumer les modules d'Ansible - l'édition Linux
J'ai essayé de résumer les paramètres des différentes bases de données de Django (MySQL, PostgreSQL)
J'ai essayé de résumer les opérations susceptibles d'être utilisées avec numpy-stl
[IBM Cloud] J'ai essayé d'accéder à la table Db2 on Cloud à partir de Cloud Funtions (python)
[Python] J'ai essayé d'obtenir le nom du type sous forme de chaîne de caractères à partir de la fonction type
Je n'ai pas compris le redimensionnement de TensorFlow, alors je l'ai résumé visuellement.
J'ai essayé de passer le test G et la qualification E en m'entraînant à partir de 50
J'ai essayé Web Scraping pour analyser les paroles.
J'ai essayé d'accéder à l'API Qiita depuis le début
J'ai essayé d'optimiser le séchage du linge
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé de corriger la forme trapézoïdale de l'image
Qiita Job J'ai essayé d'analyser le travail
J'ai essayé de mettre en œuvre le problème du voyageur de commerce
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
[LPIC 101] J'ai essayé de résumer les options de commande qui sont faciles à faire une erreur
[CodeIQ] J'ai écrit la distribution de probabilité des dés (du cours de mathématiques CodeIQ pour l'apprentissage automatique [Distribution de probabilités])
J'ai essayé de trier les objets de l'image du plat de steak-④ Clustering
J'ai essayé de résumer les nouvelles personnes infectées par le virus corona dans la ville d'Ichikawa, préfecture de Chiba
[Python] J'ai essayé de résumer le tableau, la méthode de génération du dictionnaire, la méthode de boucle, la notation d'inclusion de liste