2013-03-14 13 views
15

Chcę wykreślić aproksymację funkcji gęstości prawdopodobieństwa na podstawie próbki, którą posiadam; Krzywa, która naśladuje zachowanie histogramu. Mogę mieć próbki tak duże, jak chcę.Wykreślanie gęstości prawdopodobieństwa przez próbkę z matplotlibem

+0

Jaka jest twoja próbka? Czy jest to dystrybucja, czy rzeczywiste dane? – askewchan

+1

Nie rozumiem, jak ktoś mógłby głosować na to pytanie ?! Mam na myśli na podstawie tego, co ??? – Cupitor

+2

zwykle na [SO] ludzie będą głosować pytania, które są natychmiast jasne, a także pokazują próbę przez pytającego, aby odpowiedzieć na własne pytanie. "Co próbowałeś?" Zwykle komentarze w dół towarzyszą komentarzom, więc nie jestem pewien, dlaczego tak się nie stało w tym przypadku. – askewchan

Odpowiedz

25

Jeśli chcesz wykreślić dystrybucji, i wiesz, definiują ją jako funkcję, i wykreślić ją jako tak:

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() 

Jeśli nie masz dokładną dystrybucję w postaci funkcja analityczna, być może wygenerować dużą próbkę, wziąć histogram i jakoś wygładzić dane:

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() 

można zwiększyć lub zmniejszyć s (współczynnik wygładzania) w UnivariateSpline f wywołanie działania w celu zwiększenia lub zmniejszenia wygładzania. Na przykład, używając dwóch otrzymasz: dist to func

+0

która nie pomaga w moim przypadku. Już napisałem funkcję pobierania próbek i nie jest ona dokładna dla próbek o rozmiarze jednym powiedzmy! – Cupitor

+0

Następnie myślę, że powinieneś edytować swoje pytanie, aby było bardziej zrozumiałe. To odpowiada na twoje pytanie zakładając, że "masz dystrybucję". – askewchan

+0

Dziękuję. Ale pojawia się następujący błąd: Podnieś ValueError ("tablice x i y muszą mieć równą długość wzdłuż" ValueError: tablice x i y muszą być równej długości wzdłuż osi interpolacji – Cupitor

18

Co musisz zrobić, to użyć gaussian_kde z pakietu scipy.stats.kde.

podane swoje dane można zrobić coś takiego:

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)) 

Gęstość jądra może być skonfigurowany do woli i może obsługiwać dane N-wymiarowych z łatwością. Pozwoli to również uniknąć zniekształceń spline, które można zobaczyć na działce podanej przez askewchan.

enter image description here

+0

Szukam podobnego rozwiązania. Mam już zestaw danych, ale nie wiem, co to ma dystrybucji, więc próbuję wykreślić funkcję rozkładu prawdopodobieństwa za pomocą Pythona, a ja nie wiem, jak to wykreślić. Każda pomoc jest w tym przypadku doceniana. –

+1

@SitzBlogz Powiedzmy, że twój zestaw danych nazywa się 'data', a następnie po prostu usuń linię' data = randn (1000) 'w odpowiedzi @EnricoGiampieri i gotowe! –

Powiązane problemy