Python'da özel olasılık yoğunluk işlevini tanımlama


20

Kendi olasılık yoğunluk fonksiyonumu tanımlamak için bazı yerleşik Python paketini (örneğin SciPy) kullanarak (daha önce herhangi bir veri olmadan, sadece ), bu yüzden onunla hesaplamalar yapabilirim (elde etme gibi) sürekli rasgele değişkenin varyansı)? Tabii ki, SymPy veya Sage alabilir, sembolik bir işlev yaratabilir ve işlemleri yapabilirim, ama tüm bu işi kendim yapmak yerine zaten uygulanmış bir paketi kullanıp kullanamayacağımı merak ediyorum.f(x)=ax+b


Kolay bir yol için teşekkürler! Özel dağıtım işlevini bu şekilde tanımlayan rasgele sayıların bir histogramını nasıl oluşturursunuz?
Ankur Agrawal

Yanıtlar:


23

Scvy.stats içinde rv_continuous sınıfını alt sınıflara ayırmanız gerekir

import scipy.stats as st

class my_pdf(st.rv_continuous):
    def _pdf(self,x):
        return 3*x**2  # Normalized over its range, in this case [0,1]

my_cv = my_pdf(a=0, b=1, name='my_pdf')

şimdi my_cv verilen PDF ve aralık ile sürekli rasgele bir değişkendir [0,1]

Not bu örnekte my_pdfve my_cvkeyfi isimler (yani şey olabilirdi) ama vardır _pdfolduğunu değil keyfi; o ve _cdfiçinde yöntemlerdir st.rv_continuousişe subclassing için sırayla üzerine yazılır olması gereken biri.


@GertVdE: def _pdf içinde "öz" ne yapar ??
Srivatsan

@Srivatsan: Stack Overflow
GertVdE

Normalleştirmeyle ilgili bir sorun var, burada: normalleştirilmiş bir olasılık dağılım fonksiyonu vermeniz gerekir ( 3*x**2burada) veya ortaya çıkan rastgele değişken yanlış sonuçlar verir ( my_cv.median()örneğin kontrol edebilirsiniz ). Kodu düzelttim.
Eric O Lebigot

@ EOL "normalleştirilmiş" kafa karıştırıcı terimini kullanımınızı buluyorum. İhtiyaç duyduğum şey, işlevin 0'da ortalanması ve 1'e ölçeklendirilmesi için olduğuna inanıyorum, ancak bu cevap normalleşmenin x[0, 1] aralığında olması gerektiği anlamına geliyor . Açıklayabilir misin?
dbliss

1
Belki de standart yol kullanmaktır my_cv.rvs()( sizetek seferde birden fazla örnek elde etmek için argüman alabilir ). Belgelerden tahmin ettiğim şey bu ( docs.scipy.org/doc/scipy/reference/generated/… ).
Eric O Lebigot

15

Sympy.stats sayfasını kontrol etmelisiniz. Rastgele değişkenlerle başa çıkmak için bir arayüz sağlar. Aşağıdaki örnek, Xyoğunluk ile birim aralığında tanımlanan rastgele bir değişken sağlar2x

In [1]: from sympy.stats import *
In [2]: x = Symbol('x')
In [3]: X = ContinuousRV(x, 2*x, Interval(0, 1))

In [4]: P(X>.5) 
Out[4]: 0.750000000000000

In [5]: Var(X) # variance
Out[5]: 1/18

In [6]: E(2*cos(X)+X**2) # complex expressions are ok too
Out[6]: -7/2 + 4cos(1) + 4sin(1)

Eğer ilgileniyorsanız bu soyutlama bazı oldukça karmaşık manipülasyonlarla başa çıkabilir.


Vay be ... bu harika! Bu katkı için çok teşekkür ederim. Bunu ve blogunuzu takip
edeceğim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.