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