Визначте власну функцію щільності ймовірності в Python


20

Чи є спосіб, використовуючи якийсь встановлений пакет Python (наприклад, SciPy), визначити власну функцію щільності ймовірності (без будь-яких попередніх даних, просто ), тож я можу робити з нею обчислення (наприклад, отримання дисперсії безперервної випадкової величини)? Звичайно, я міг би взяти, скажімо, SymPy або Sage, створити символічну функцію та зробити операції, але мені цікаво, чи замість того, щоб робити всю цю роботу сам, я можу використати вже реалізований пакет.f(х)=ах+б


Дякуємо за простий спосіб! Як ви генеруєте гістограму випадкових чисел, реалізуючи цей спосіб визначення функції користувальницького розподілу?
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 є довільними; це і є методами, в одному з яких необхідно перезаписати для того, щоб підклас працював._cdfst.rv_continuous


@GertVdE: Що робить "Я" у def _pdf?
Срівацан


Тут є проблема з нормалізацією: тут потрібно надати нормалізовану функцію розподілу ймовірностей ( 3*x**2, тут), або отримана випадкова величина дає неправильні результати (ви можете перевірити my_cv.median(), наприклад). Я виправив код.
Ерік О Лебігот

@EOL Я вважаю, що ви використовуєте термін "нормалізований" заплутаним. я вважаю, що функція повинна бути орієнтована на 0 і масштабуватись до 1., але ця відповідь, мабуть, означає, що нормалізація повинна перевищувати діапазон x[0, 1]. Ви можете уточнити?
dbliss

1
Можливо, стандартним способом є використання my_cv.rvs()(яке може взяти sizeаргумент, для отримання декількох зразків за один раз). Це я здогадуюсь із документації ( docs.scipy.org/doc/scipy/reference/generated/… ).
Ерік О Лебігот

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.