Tentukan fungsi kepadatan probabilitas khusus dalam Python

20

Apakah ada cara, menggunakan beberapa paket Python yang sudah ada (misalnya SciPy) untuk mendefinisikan fungsi kepadatan probabilitas saya sendiri (tanpa data sebelumnya, hanya ), jadi saya kemudian dapat membuat perhitungan dengan itu (seperti mendapatkan varians dari variabel acak kontinu)? Tentu saja saya dapat mengambil, katakanlah, SymPy atau Sage, membuat fungsi simbolis dan melakukan operasi, tetapi saya bertanya-tanya apakah alih-alih melakukan semua pekerjaan ini sendiri, saya dapat menggunakan paket yang sudah diimplementasikan.f(x)=Sebuahx+b

astrojuanlu
sumber
Terima kasih untuk cara yang mudah! Bagaimana Anda menghasilkan histogram angka acak yang menerapkan cara mendefinisikan fungsi distribusi kustom ini?
Ankur Agrawal

Jawaban:

23

Anda harus subclass rv_continuous kelas di scipy.stats

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

sekarang my_cv adalah variabel acak kontinu dengan PDF dan kisaran yang diberikan [0,1]

Perhatikan bahwa dalam contoh ini my_pdfdan my_cvadalah nama sewenang-wenang (yang bisa saja apa-apa), tapi _pdfini tidak sewenang-wenang; dan _cdfmerupakan metode yang st.rv_continuoussalah satunya harus ditimpa agar subclass dapat berfungsi.

GertVdE
sumber
@GertVdE: Apa yang dilakukan "diri" di def _pdf lakukan ??
Srivatsan
@Srivatsan: lihat jawabannya di Stack Overflow
GertVdE
Ada masalah dengan normalisasi, di sini: Anda perlu memberikan fungsi distribusi probabilitas yang dinormalisasi ( 3*x**2, di sini), atau variabel acak yang dihasilkan menghasilkan hasil yang salah (Anda dapat memeriksa my_cv.median(), misalnya). Saya memperbaiki kodenya.
Eric O Lebigot
@ EOL saya menemukan penggunaan istilah membingungkan "normalisasi". apa yang dibutuhkan, saya percaya, adalah agar fungsi dipusatkan pada 0 dan diskalakan ke 1. tetapi jawaban ini tampaknya menyiratkan bahwa normalisasi harus berada pada kisaran x[0, 1]. bisakah kamu mengklarifikasi?
dbliss
1
Mungkin cara standar adalah menggunakan my_cv.rvs()(yang dapat mengambil sizeargumen, untuk mendapatkan beberapa sampel sekaligus). Inilah yang saya kira dari dokumentasi ( docs.scipy.org/doc/scipy/reference/generated/… ).
Eric O Lebigot
15

Anda harus memeriksa sympy.stats. Ini menyediakan antarmuka untuk menangani variabel acak. Contoh berikut memberikan variabel acak yang Xdidefinisikan pada interval satuan dengan kepadatan2x

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)

Jika Anda tertarik, abstraksi ini dapat menangani beberapa manipulasi yang cukup rumit.

MRocklin
sumber
Wow ... ini luar biasa! Terima kasih banyak atas kontribusi ini. Saya akan mengawasi ini dan blog Anda
astrojuanlu