Pythonでカスタム確率密度関数を定義する


20

自分自身を定義するためにいくつかの確立Pythonパッケージ(例えばscipyのダウンロード)を使用しての方法があり、確率密度関数を(ただ、事前のデータなしでのような、私はそれで計算を行うことができるようには、()連続ランダム変数の分散を取得する)?もちろん、SymPyやSageなどを使用して、シンボリック関数を作成し、操作を行うこともできますが、この作業をすべて自分で行う代わりに、既に実装されているパッケージを利用できるのではないかと考えています。fバツ=aバツ+b


簡単な方法をありがとう!カスタム分布関数を定義するこの方法を実装する乱数のヒストグラムをどのように生成しますか?
アンクルアグラワル

回答:


23

scipy.statsでrv_continuousクラスをサブクラス化する必要があります

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_pdfmy_cvはとは任意の名前(任意の名前)ですが、任意で_pdfはありません。それと_cdfのメソッドあるst.rv_continuous仕事にサブクラス化のための順に上書きされなければならないの1。


@GertVdE:def _pdfの「自己」とは何ですか?
Srivatsan


ここで、正規化に問題があります。正規化された確率分布関数(3*x**2、ここ)を提供する必要があります。そうでない場合、結果のランダム変数は誤った結果をもたらします(my_cv.median()たとえば、チェックできます)。コードを修正しました。
エリックOレビゴ

@EOL「正規化された」という用語の使用がわかりにくい。必要なのは、関数の中心を0にして1にスケーリングすることですが、この答えは、正規化がx[0、1]の範囲を超える必要があることを暗示しているようです。明確にできますか?
dbliss

1
たぶん、標準的な方法はmy_cv.rvs()size一度に複数のサンプルを取得するために引数を取ることができる)を使用することです。これは、ドキュメント(docs.scipy.org/doc/scipy/reference/generated/…)から推測したものです。
エリックOレビゴ

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)

興味があれば、この抽象化はかなり複雑な操作を処理できます。


うわー、これは最高です!この貢献に感謝します。私はこれとあなたのブログに目を
光らせ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.