Si vous aimez linspace
et préférez les one-liners, vous pouvez le faire :
plt.plot(np.sort(a), np.linspace(0, 1, len(a), endpoint=False))
Étant donné mes goûts, je le fais presque toujours :
# a is the data array
x = np.sort(a)
y = np.arange(len(x))/float(len(x))
plt.plot(x, y)
Ce qui fonctionne pour moi même s'il y a >O(1e6)
les valeurs des données. Si vous avez vraiment besoin de réduire l'échantillonage, je mettrais
x = np.sort(a)[::down_sampling_step]
Modifier pour répondre au commentaire/rédaction sur la raison pour laquelle j'utilise endpoint=False
ou le y
comme défini ci-dessus. Voici quelques détails techniques.
La CDF empirique est généralement définie formellement comme suit
CDF(x) = "number of samples <= x"/"number of samples"
afin de correspondre exactement à cette définition formelle, il faudrait utiliser y = np.arange(1,len(x)+1)/float(len(x))
de sorte que nous obtenions y = [1/N, 2/N ... 1]
. Cet estimateur est un estimateur sans biais qui convergera vers la vraie CDF dans la limite d'échantillons infinis. Wikipédia réf. .
J'ai tendance à utiliser y = [0, 1/N, 2/N ... (N-1)/N]
car (a) il est plus facile à coder/plus idiomatique, (b) mais est toujours formellement justifié puisqu'on peut toujours échanger CDF(x)
con 1-CDF(x)
dans la preuve de convergence, et (c) fonctionne avec la méthode de sous-échantillonnage (facile) décrite ci-dessus.
Dans certains cas particuliers, il est utile de définir
y = (arange(len(x))+0.5)/len(x)
qui est intermédiaire entre ces deux conventions. Ce qui, en fait, dit "il y a une 1/(2N)
chance d'avoir une valeur inférieure à la plus basse que j'ai vue dans mon échantillon, et une 1/(2N)
chance d'une valeur supérieure à la plus grande que j'ai vue jusqu'à présent.
Notez que la sélection de cette convention interagit avec l'option where
utilisé dans le plt.step
s'il semble plus utile d'afficher la FCD comme une fonction constante par morceaux. Afin de correspondre exactement à la définition formelle mentionnée ci-dessus, il faudrait utiliser where=pre
la proposition y=[0,1/N..., 1-1/N]
convention, ou where=post
avec le y=[1/N, 2/N ... 1]
convention, mais pas l'inverse.
Cependant, pour de grands échantillons et des distributions raisonnables, la convention donnée dans le corps de la réponse est facile à écrire, est un estimateur sans biais de la vraie CDF et fonctionne avec la méthodologie de sous-échantillonnage.