[PYTHON] Calculer la distribution de l'échantillon avec Scipy (distribution discrète)

Objectif

Compte tenu de la distribution de probabilité de la population, calculez la distribution de l'échantillon. Cette fois, nous traiterons des distributions discrètes.

Méthode

politique

--Utilisez le package statistique scipy.stats de scipy, qui est une collection de packages de calcul scientifique et technologique de python, et numpy de la bibliothèque de calcul numérique.

  1. Définissez la distribution de probabilité discrète de la population comme une distribution discrète sur scipy.stats
  2. Effectuer un échantillonnage
  3. Calculez la distribution de l'échantillon à partir de l'échantillon obtenu

Définition de la distribution discrète

scipy.stats.rv_discrete Ce qui suit est un extrait de la documentation scipy. Vous pouvez le trouver dans la section Exemple d'aide, que vous pouvez lire comme suit:

from scipy import stats
help(stats.rv_discrete)

Définition de la distribution discrète

Passez simplement la variable de probabilité discrète à $ xk $, la probabilité correspondant à $ pk $, et passez-la à stats.rv_discrete. Voici un exemple de variable stochastique qui prend 7 valeurs discrètes.

from scipy import stats
xk = np.arange(7)
pk = (0.1, 0.2, 0.3, 0.1, 0.1, 0.0, 0.2)
custm = stats.rv_discrete(name='custm', values=(xk, pk))

Visualisation de la distribution discrète

Pour visualiser la fonction de masse probabiliste (pmf) de la distribution discrète, procédez comme suit.

import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 1)
ax.plot(xk, custm.pmf(xk), 'ro', ms=12, mec='r')
ax.vlines(xk, 0, custm.pmf(xk), colors='r', lw=4)
plt.show()

échantillonnage

L'échantillonnage est effectué à partir de la distribution discrète créée. Par exemple, si vous souhaitez échantillonner au hasard 1 000 fois, vous pouvez procéder comme suit. (rvs: random variables) Si vous souhaitez corriger la graine du nombre aléatoire pour assurer la reproductibilité, supprimez la mise en commentaire de la première ligne.

import numpy as np
# np.random.seed(0)
sampled_rvs = custm.rvs(size=1000)

Calcul de la distribution de l'échantillon

Calculez en utilisant la fonction d'histogramme de numpy. Veillez à ne pas oublier d'ajouter +1 à la corbeille.

f = np.histogram(sampled_rvs, bins = np.arange(7 + 1), density=True)[0]

Mettre ensemble dans une fonction

Le contenu ci-dessus est résumé. Jusqu'à présent, nous avons traité le cas de la distribution de probabilité unidimensionnelle, mais pour pouvoir gérer une distribution de probabilité simultanée multidimensionnelle. Tout d'abord, écrasez-le à une dimension avec p.ravel (), calculez la distribution de l'échantillon, remodelez-la, puis renvoyez-la. Passez l'argument p comme un tableau de nupmy.

import numpy as np
from scipy import stats

def sampling_dist(p, size, seed = 0):
    xk = np.arange(p.size)
    pk = p.ravel()
    true_dist = stats.rv_discrete(name='true_dist', values=(xk, pk))

    np.random.seed(seed)
    sampled_rvs = true_dist.rvs(size=size)

    f = np.histogram(sampled_rvs, bins = np.arange(p.size + 1), density=True)[0]
    f.reshape(p.shape)

    return(f.reshape(p.shape))

p = np.array([[0.10,0.10],[0.10,0.15],[0.15,0.10],[0.10,0.20]])
p_est = sampling_dist(p, 1000)
print(p)
print(p_est)

Recommended Posts

Calculer la distribution de l'échantillon avec Scipy (distribution discrète)
Générer une distribution normale avec SciPy
LPC avec Scipy
ICA avec Scipy
CORDIC avec Scipy
1. Statistiques apprises avec Python 2-1. Distribution de probabilité [variable discrète]
Créer un filtre avec scipy
Normariser les données avec Scipy
Calculer tf-idf avec scikit-learn
Exemple de données créées avec python
3. Distribution normale avec un réseau neuronal!
Utilisez OpenBLAS avec numpy, scipy
[MCMC] Calculer WAIC avec pystan
Extraire la valeur de crête avec scipy