Xác định hàm mật độ xác suất tùy chỉnh trong Python


20

Có cách nào không, sử dụng một số gói Python đã thiết lập (ví dụ SciPy) để xác định hàm mật độ xác suất của riêng tôi (không có bất kỳ dữ liệu nào trước đó, chỉ cần ), do đó tôi có thể thực hiện tính toán với nó (chẳng hạn như lấy phương sai của biến ngẫu nhiên liên tục)? Tất nhiên tôi có thể sử dụng SymPy hoặc Sage, tạo một chức năng tượng trưng và thực hiện các thao tác, nhưng tôi tự hỏi liệu thay vì tự mình làm tất cả công việc này, tôi có thể sử dụng gói đã được triển khai hay không.f(x)=ax+b


Cảm ơn cho một cách dễ dàng! Làm thế nào để bạn tạo ra một biểu đồ các số ngẫu nhiên thực hiện cách xác định chức năng phân phối tùy chỉnh này?
Ankur Agrawal

Câu trả lời:


23

Bạn phải phân lớp lớp rv_continupt trong 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')

bây giờ my_cv là một biến ngẫu nhiên liên tục với phạm vi và phạm vi PDF đã cho [0,1]

Lưu ý rằng trong ví dụ này my_pdfmy_cvlà các tên tùy ý (có thể là bất cứ thứ gì), nhưng không phải_pdf là tùy ý; nó và là các phương thức trong một trong số đó phải được ghi đè để phân lớp hoạt động._cdfst.rv_continuous


@GertVdE: "Tự" trong def _pdf làm gì ??
Srivatsan


Có một vấn đề với việc chuẩn hóa, ở đây: bạn cần đưa ra hàm phân phối xác suất chuẩn hóa ( 3*x**2, ở đây) hoặc biến ngẫu nhiên kết quả mang lại kết quả không chính xác ( my_cv.median()ví dụ bạn có thể kiểm tra ). Tôi đã sửa mã.
Eric O Lebigot

@EOL Tôi thấy bạn sử dụng thuật ngữ "bình thường hóa" khó hiểu. những gì cần thiết, tôi tin rằng, là để hàm được tập trung ở mức 0 và được chia tỷ lệ thành 1. nhưng câu trả lời này dường như ngụ ý rằng việc chuẩn hóa cần phải vượt quá phạm vi x[0, 1]. bạn có thể làm rõ?
dbliss

1
Có thể cách tiêu chuẩn là sử dụng my_cv.rvs()(có thể lấy một sizeđối số, để lấy nhiều mẫu trong một lần). Đây là những gì tôi đoán từ tài liệu ( docs.scipy.org/doc/scipy/reference/generated/ ám ).
Eric O Lebigot

15

Bạn nên kiểm tra sympy.stats. Nó cung cấp một giao diện để đối phó với các biến ngẫu nhiên. Ví dụ sau đây cung cấp một biến ngẫu nhiên Xđược xác định trên khoảng đơn vị với mật độ2x

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)

Nếu bạn quan tâm đến sự trừu tượng này có thể xử lý một số thao tác khá phức tạp.


Wow ... điều này thật tuyệt vời! Cảm ơn bạn rất nhiều vì sự đóng góp này. Tôi sẽ theo dõi điều này và blog của bạn
astrojuanlu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.