web-dev-qa-db-fra.com

Tracer la fonction de densité de probabilité par échantillon avec matplotlib

Je veux tracer une approximation de la fonction de densité de probabilité basée sur un échantillon que j'ai; Courbe qui imite le comportement de l'histogramme. Je peux avoir des échantillons aussi gros que je veux.

20
Cupitor

Si vous voulez tracer une distribution et que vous la connaissez, définissez-la comme une fonction et tracez-la comme suit:

import numpy as np
from matplotlib import pyplot as plt

def my_dist(x):
    return np.exp(-x ** 2)

x = np.arange(-100, 100)
p = my_dist(x)
plt.plot(x, p)
plt.show()

Si vous n'avez pas la distribution exacte en tant que fonction analytique, vous pouvez peut-être générer un grand échantillon, prendre un histogramme et en quelque sorte lisser les données:

import numpy as np
from scipy.interpolate import UnivariateSpline
from matplotlib import pyplot as plt

N = 1000
n = N//10
s = np.random.normal(size=N)   # generate your data sample with N elements
p, x = np.histogram(s, bins=n) # bin it into n = N//10 bins
x = x[:-1] + (x[1] - x[0])/2   # convert bin edges to centers
f = UnivariateSpline(x, p, s=n)
plt.plot(x, f(x))
plt.show()

Vous pouvez augmenter ou diminuer s (facteur de lissage) dans l'appel de fonction UnivariateSpline pour augmenter ou diminuer le lissage. Par exemple, en utilisant les deux, vous obtenez: dist to func

31
askewchan

Ce que vous devez faire est d'utiliser le gaussian_kde du paquet scipy.stats.kde.

compte tenu de vos données, vous pouvez faire quelque chose comme ceci:

from scipy.stats.kde import gaussian_kde
from numpy import linspace
# create fake data
data = randn(1000)
# this create the kernel, given an array it will estimate the probability over that values
kde = gaussian_kde( data )
# these are the values over wich your kernel will be evaluated
dist_space = linspace( min(data), max(data), 100 )
# plot the results
plt.plot( dist_space, kde(dist_space) )

La densité du noyau peut être configurée à volonté et peut facilement gérer des données à N dimensions. Cela évitera également la distorsion spline que vous pouvez voir dans l'intrigue donnée par askewchan.

enter image description here

23
EnricoGiampieri