กำหนดฟังก์ชันความหนาแน่นของความน่าจะเป็นที่กำหนดเองใน Python


20

มีวิธีใช้แพ็กเกจ Python ที่จัดตั้งขึ้น (เช่น SciPy) เพื่อกำหนดฟังก์ชั่นความหนาแน่นของความน่าจะเป็นของตัวเอง(ไม่มีข้อมูลก่อนหน้านี้เพียงแค่ ) ดังนั้นฉันจึงสามารถทำการคำนวณได้ ความแปรปรวนของตัวแปรสุ่มต่อเนื่อง)? แน่นอนว่าฉันสามารถใช้พูด SymPy หรือ Sage สร้างฟังก์ชั่นสัญลักษณ์และดำเนินการ แต่ฉันสงสัยว่าแทนที่จะทำงานทั้งหมดนี้ด้วยตัวเองฉันสามารถใช้แพ็คเกจที่ใช้งานแล้วf(x)=ax+b


ขอบคุณสำหรับวิธีที่ง่าย! คุณจะสร้างฮิสโตแกรมของตัวเลขสุ่มโดยใช้วิธีนี้ในการกำหนดฟังก์ชั่นการกระจายแบบกำหนดเองได้อย่างไร
Ankur Agrawal

คำตอบ:


23

คุณต้องคลาสย่อยคลาสrv_continuousใน 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')

ตอนนี้ my_cv เป็นตัวแปรสุ่มต่อเนื่องที่มี PDF และช่วงที่กำหนด [0,1]

โปรดทราบว่าในตัวอย่างนี้my_pdfและmy_cvเป็นชื่อพล (ที่จะได้รับอะไร) แต่_pdfเป็นไม่ได้โดยพล; มันและ_cdfเป็นวิธีการst.rv_continuousหนึ่งในนั้นจะต้องถูกเขียนทับเพื่อให้ subclassing ทำงาน


@GertVdE: "ตัวเอง" ใน def _pdf ทำอะไร ??
Srivatsan


มีปัญหาเกี่ยวกับการทำให้เป็นมาตรฐานที่นี่: คุณต้องให้ฟังก์ชันการแจกแจงความน่าจะเป็นแบบปกติ ( 3*x**2ที่นี่) หรือตัวแปรสุ่มผลลัพธ์ผลลัพธ์ที่ไม่ถูกต้อง (คุณสามารถตรวจสอบmy_cv.median()ได้) ฉันแก้ไขรหัส
Eric O Lebigot

@EOL ฉันพบว่าการใช้คำว่า "ปกติ" ของคุณสับสน สิ่งที่จำเป็นผมเชื่อว่าสำหรับฟังก์ชั่นที่จะเป็นศูนย์กลางที่ 0 และมีขนาด 1 แต่คำตอบนี้ดูเหมือนจะบ่งบอกว่าความต้องการการฟื้นฟูจะมากกว่าช่วงx[0, 1] คุณอธิบายได้ไหม
dbliss

1
บางทีวิธีมาตรฐานคือการใช้my_cv.rvs()(ซึ่งสามารถsizeโต้แย้งเพื่อรับหลายตัวอย่างในครั้งเดียว) นี่คือสิ่งที่ฉันเดาจากเอกสาร ( docs.scipy.org/doc/scipy/reference/generated/ ...... )
Eric O Lebigot

15

คุณควรตรวจสอบ sympy.stats มันมีอินเตอร์เฟซที่จะจัดการกับตัวแปรสุ่ม ตัวอย่างต่อไปนี้ให้ตัวแปรสุ่มที่Xกำหนดไว้ในช่วงเวลาของหน่วยด้วยความหนาแน่น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)

หากคุณสนใจสิ่งที่เป็นนามธรรมนี้สามารถจัดการกิจวัตรที่ค่อนข้างซับซ้อนได้


ว้าว ... นี่มันยอดเยี่ยมมาก! ขอบคุณมากสำหรับความช่วยเหลือนี้ ฉันจะจับตาดูสิ่งนี้และบล็อกของคุณ
astrojuanlu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.