【问题标题】:how can I check whether a scipy distribution is discrete?如何检查 scipy 分布是否是离散的?
【发布时间】:2020-04-30 17:29:52
【问题描述】:

我想检查scipy 分布是离散的还是连续的。无论对象是来自命名分布的冻结分布对象,还是自定义rv_discreterv_continuous 分布的实例,测试都应该有效。

我的第一个想法是检查变量的类型,但这似乎与连续与离散并不完全对应。例如,这里有四种分布:

from scipy.stats import *
import numpy as np

dist_norm = norm(10, 2)
dist_poisson = poisson(10)

class continuous_gen(rv_continuous):
    def _pdf(self, x, *args):
        if x >= 0 and x <= 1:
            return 1
        else:
            return 0
dist_contin = continuous_gen()

xk = np.arange(7)
pk = (0.1, 0.2, 0.3, 0.1, 0.1, 0.0, 0.2)
dist_discrete = rv_discrete(values=(xk, pk))

以下是它们的类型:

type(dist_norm)
Out[59]: scipy.stats._distn_infrastructure.rv_frozen
type(dist_poisson)
Out[60]: scipy.stats._distn_infrastructure.rv_frozen
type(dist_contin)
Out[61]: __main__.continuous_gen
type(dist_discrete)
Out[62]: scipy.stats._distn_infrastructure.rv_sample

现在我已经通过尝试访问pmf() 方法(只有离散分布具有)实现了is_discrete() 函数,但我不确定这是否是最干净或最可靠的方法。有没有更好的办法?

def is_discrete(dist):
    try:
        _ = dist.pmf(0)
        return True
    except:
        return False

【问题讨论】:

  • except AttributeError:

标签: python scipy distribution


【解决方案1】:

您可以使用isinstance 内置函数来定义自定义检查:

from scipy.stats import poisson, norm, rv_discrete, rv_continuous

def is_discrete(dist):

    if hasattr(dist, 'dist'):
        return isinstance(dist.dist, rv_discrete)
    else: return isinstance(dist, rv_discrete)

def is_continuous(dist):

    if hasattr(dist, 'dist'):
        return isinstance(dist.dist, rv_continuous)
    else: return isinstance(dist, rv_continuous)

这将导致:

class continuous_gen(rv_continuous):
    def _pdf(self, x, *args):
        if x >= 0 and x <= 1:
            return 1
        else:
            return 0
dist_contin = continuous_gen()
dist_poisson = poisson(10)

is_discrete(dist_contin)
#False
is_continuous(dist_contin)
#True
is_discrete(dist_poisson)
#True
is_continuous(dist_poisson)
#False

【讨论】:

  • 这似乎可行,但我必须先检查对象是冻结分布还是自定义分布。因此,在我的问题示例中,我必须将isinstance(dist_poisson.dist, rv_discrete) 用于dist_poisson(这是一个冻结分布),但isinstance(dist_discrete, rv_discrete) 用于dist_discrete(这是一个自定义分布)。那么在这种情况下,我如何检查分发是冻结分发还是自定义分发?
  • 编辑了我的答案,介绍了使用 hasattr 函数的检查。希望对你有帮助
  • 冻结发行版是 rv_frozen 的实例
猜你喜欢
  • 2017-05-30
  • 2015-06-14
  • 2012-11-08
  • 1970-01-01
  • 2019-01-25
  • 2013-03-21
  • 1970-01-01
  • 2021-04-05
相关资源
最近更新 更多