Definire la funzione di densità di probabilità personalizzata in Python


20

Esiste un modo, usando alcuni pacchetti Python consolidati (ad es. SciPy) per definire la mia funzione di densità di probabilità (senza dati precedenti, solo ), quindi posso quindi fare calcoli con esso (come ottenere la varianza della variabile casuale continua)? Ovviamente potrei prendere, per esempio, SymPy o Sage, creare una funzione simbolica e fare le operazioni, ma mi chiedo se invece di fare tutto questo lavoro da solo posso fare uso di un pacchetto già implementato.f(x)=ax+b


Grazie per un modo semplice! Come si genera un istogramma di numeri casuali implementando questo modo di definire la funzione di distribuzione personalizzata?
Ankur Agrawal,

Risposte:


23

Bisogna sottoclasse il rv_continuous classe 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')

ora my_cv è una variabile casuale continua con il PDF e l'intervallo dati [0,1]

Si noti che in questo esempio my_pdfe my_cvsono nomi arbitrari (che avrebbe potuto essere qualsiasi cosa), ma non_pdf è arbitrario; esso e sono metodi in uno dei quali devono essere sovrascritti affinché la sottoclasse funzioni._cdfst.rv_continuous


@GertVdE: Cosa fa "self" in def _pdf ??
Srivatsan,


C'è un problema con la normalizzazione, qui: devi dare una funzione di distribuzione di probabilità normalizzata ( 3*x**2, qui), o la variabile casuale risultante produce risultati errati (puoi controllare my_cv.median(), per esempio). Ho corretto il codice.
Eric O Lebigot,

@EOL Sto trovando il tuo uso del termine "normalizzato" confuso. ciò che è necessario, credo, è che la funzione sia centrata su 0 e ridimensionata su 1. ma questa risposta sembra implicare che la normalizzazione deve essere al di sopra dell'intervallo di x[0, 1]. puoi chiarire?
dbliss,

1
Forse il modo standard è quello di usare my_cv.rvs()(che può prendere un sizeargomento, per ottenere più campioni in una volta sola). Questo è ciò che immagino dalla documentazione ( docs.scipy.org/doc/scipy/reference/generated/… ).
Eric O Lebigot,

15

Dovresti dare un'occhiata a sympy.stats. Fornisce un'interfaccia per gestire variabili casuali. L'esempio seguente fornisce una variabile casuale Xdefinita sull'intervallo unitario con densità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)

Se ti interessa questa astrazione può gestire alcune manipolazioni abbastanza complesse.


Wow ... questo è semplicemente fantastico! Grazie mille per questo contributo. Terrò d'occhio questo e il tuo blog
astrojuanlu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.