मैं एक ContinuousRV एक अजगर-कार्यान्वित संभाव्यता घनत्व समारोह (पीडीएफ) दिया। निम्नलिखित एक न्यूनतम कार्यशील उदाहरण है जिसका अंतिम कथन एक ValueError उत्पन्न करता है

import numpy as np
from scipy.stats import gaussian_kde, norm
from sympy import Interval, oo, symbols
from sympy.stats import ContinuousRV
from sympy.utilities.lambdify import implemented_function

# Example Data
measures = np.concatenate([norm.rvs(loc=-2, size=64), norm.rvs(loc=3, size=32)])

# Definition of the PDF
pdf_kde = gaussian_kde(measures)
pdf_sym = implemented_function("pdf", pdf_kde)

# Create the symbolic variable
XName, x = symbols('X x')
X = ContinuousRV(XName, pdf_sym(x), set=Interval(-oo, oo))

उदाहरण निम्न त्रुटि के साथ विफल रहता है:

.../lib/python3.8/site-packages/sympy/stats/crv_types.py in check(pdf, set)
    149         x = Dummy('x')
    150         val = integrate(pdf(x), (x, set))
--> 151         _value_check(val == S.One, "The pdf on the given set is incorrect.")
    152 
    153 

.../lib/python3.8/site-packages/sympy/stats/rv.py in _value_check(condition, message)
   1450     truth = fuzzy_and(condition)
   1451     if truth == False:
-> 1452         raise ValueError(message)
   1453     return truth == True
   1454 

ValueError: The pdf on the given set is incorrect.

मैंने पुष्टि की है कि पीडीएफ एक अच्छा सन्निकटन है।

from scipy import integrate
value, err = integrate.quad(pdf_kde, -np.inf, np.inf)
print(value, err)
>>> 0.9999999999999996 2.318795975521764e-09

मैं वर्तमान में Python 3.8.0, Sympy 1.6, Scipy 1.4.1, और Numpy 1.18.5 का उपयोग कर रहा हूं, यदि यह प्रासंगिक है।

0
Rob Hall 14 जून 2020, 18:58

1 उत्तर

सबसे बढ़िया उत्तर

ContinuousRVविधि ContinuousDistributionHandmade और, ऐसा करने में, एक चेक विधि का आह्वान करता है जो विफल हो जाती है क्योंकि Sympy स्वचालित रूप से संख्यात्मक गणना नहीं करता है। एक रैपर का निर्माण करना संभव है जो वांछित वितरण देता है और संख्यात्मक रूप से उक्त जांच करता है।

from sympy.stats.crv import SingleContinuousDistribution

def _check_dist(pdf, set):
    from sympy import Dummy, integrate, N
    x = Dummy('x')
    integrand = pdf(x)
    integral = integrate(integrand, (x, set.start, set.end))
    v = float(N(integral))
    assert np.isclose(float(v), 1.0)

def EmpiricalRV(name: str, m: np.ndarray) -> SingleContinuousDistribution:
    from scipy.stats import gaussian_kde
    from sympy import Interval, oo
    from sympy.stats import ContinuousDistributionHandmade
    from sympy.stats.crv import SingleContinuousPSpace
    from sympy.utilities.lambdify import implemented_function

    pdf_kde = gaussian_kde(m)
    pdf_sym = implemented_function(f"f_{name}", lambda y: pdf_kde(float(y)))
    domain  = Interval(-oo, oo)

    _check_dist(pdf_sym, domain)

    dist = ContinuousDistributionHandmade(pdf_sym, domain)
    pspace = SingleContinuousPSpace(name, dist)
    return pspace.value

निम्नलिखित परीक्षण कोड कार्रवाई में यादृच्छिक चर प्रदर्शित करता है।

from scipy.stats import norm
data = np.concatenate([norm.rvs(loc=-2, size=64), norm.rvs(loc=3, size=32)])

from sympy import N
from sympy.stats import density, Normal, E, P, median
Y = EmpiricalRV('Y',data)

ev = E(Y)
evfloat = float(N(ev))

print("Y          :", Y)
print("density(Y) :", density(Y))
print("E(Y)       :", ev)
print(f"N(E(Y))    : {evfloat:.4f}")
print(f"data.mean(): {data.mean():.4f}")

>>> Y          : Y
>>> density(Y) : ContinuousDistributionHandmade(f_Y, Interval(-oo, oo))
>>> E(Y)       : Integral(Y*f_Y(Y), (Y, -oo, oo))
>>> N(E(Y))    : -0.3882
>>> data.mean(): -0.3882

उपवर्गीकरण में और अधिक मूल्य हो सकता है ContinuousDistributionHandmade या SingleContinuousDistribution

0
Rob Hall 20 जून 2020, 22:40