Calculer la Fonction de Répartition Cumulative (CDF) en Python
Comment puis-je calculer en python la Fonction de Répartition Cumulative (CDF)?
Je veux calculer à partir d'un tableau de points que j'ai (distribution discrète), pas avec le continu des distributions, par exemple, scipy.
Comment sur l'utilisation de
Pour utiliser
Vous êtes à la recherche pour ECDF. @DrV vous a fourni une version simple. Il est également disponible dans
numpy.cumsum
?Pour utiliser
numpy.cumsum
je crois que vous devez d'abord calculer le format PDF, ce qui est une surcharge.Vous êtes à la recherche pour ECDF. @DrV vous a fourni une version simple. Il est également disponible dans
statsmodels
.OriginalL'auteur wizbcn | 2014-07-16
Vous devez vous connecter pour publier un commentaire.
(Il est possible que mon interprétation de la question est mal. Si la question est de savoir comment obtenir à partir d'une discrète PDF dans un discrète CDF, puis
np.cumsum
divisé par un constant va faire si les échantillons sont equispaced. Si le tableau n'est pas equispaced, puisnp.cumsum
du tableau multiplié par la distance entre les points).Si vous avez un discret tableau d'échantillons, et vous voulez savoir la CDF de l'échantillon, alors vous pouvez simplement trier le tableau. Si vous regardez le résultat trié, vous vous rendrez compte que la plus petite valeur correspond à 0% , et la plus grande valeur représente 100 %. Si vous souhaitez connaître la valeur à 50 % de la distribution, il suffit de regarder l'élément du tableau qui est dans le milieu du tableau trié.
Laissez-nous jeter un oeil de plus près à cela avec un exemple simple:
Cela donne à la suite de l'intrigue où le côté droit de la parcelle est la traditionnelle fonction de distribution cumulée. Elle doit tenir compte de la CDF du processus derrière les points, mais, naturellement, elle n'est pas aussi longue que le nombre de points est finie.
Cette fonction est facile à inverser, et cela dépend de votre application qui forme dont vous avez besoin.
Comment puis-je obtenir une fonction que je peux utiliser? Votre réponse uniquement les parcelles.
Dans la ligne de
p = 1. * arange(len(data)) / (len(data) - 1)
devraitarange
au lieu d'êtrenp.arange
?Cette
np.linspace(0, 1, len(data))
est plus propre que le1. * arange(len(data)) / (len(data) - 1)
pour obtenir ce titre qu'une fonction, vous pouvez utiliser l'interpolation:
f = lambda x: np.interp(x, p, data_sorted)
. Ensuite, vous pouvezf(0.5)
par exemple, pour obtenir la médiane.OriginalL'auteur DrV
En supposant que vous savez comment vos données est distribuée (c'est à dire que vous connaissez le pdf de vos données), puis scipy prend en charge les données discrètes lors du calcul du cdf
On peut même imprimer les premières valeurs de la cdf pour montrer qu'ils sont discrets
La même méthode pour calculer la cdf travaille également pour de multiples dimensions: nous utilisons des données 2d ci-dessous pour illustrer
Dans les exemples ci-dessus, j'ai eu connaissance préalable que mes données a été distribuée normalement, c'est pourquoi j'ai utilisé
scipy.stats.norm()
- il y a plusieurs distributions scipy prend en charge. Mais encore une fois, vous avez besoin de savoir comment vos données sont distribuées à l'avance pour utiliser de telles fonctions. Si vous ne savez pas comment vos données sont distribuées et il vous suffit d'utiliser n'importe quelle distribution pour calculer la cdf, vous allez probablement obtenir des résultats incorrects.x
échantillonnés à partir d'une distribution normale. Vecteurx
plutôt êtrelinespace
le tracé de la paramétrique version decdf
vous avez utilisé descipy.stats
. De toute façon l'OP demander pour les non-paramétriqueCDF
, il est demandé à la discrète, mais il est très probablement censéECDF
qui est non-paramétrique.OriginalL'auteur PyRsquared