【问题标题】:Getting the parameter names of scipy.stats distributions获取 scipy.stats 分布的参数名称
【发布时间】:2015-05-26 08:16:17
【问题描述】:

我正在编写一个脚本来使用 scipy.stats 在数据集上找到最合适的分布。 我首先有一个分发名称列表,我会在上面进行迭代:

dists = ['alpha', 'anglit', 'arcsine', 'beta', 'betaprime', 'bradford', 'norm']
for d in dists:
    dist = getattr(scipy.stats, d)
    ps = dist.fit(selected_data)
    errors.loc[d,['D-Value','P-Value']] = kstest(selected.tolist(), d, args=ps)
    errors.loc[d,'Params'] = ps

现在,在这个循环之后,我选择最小 D 值以获得最佳拟合分布。现在,每个分布在 ps 中返回一组特定的参数,每个参数都有它们的名称等等(例如,对于 'alpha',它将是 alpha,而对于 'norm',它们将是 mean 和 std)。

有没有办法在 scipy.stats 中获取估计参数的名称?

提前谢谢你

【问题讨论】:

  • 恕我直言,因为你知道你使用了哪个发行版,所以明确地这样做......在你的 ps 周围制作一个包装器,并用易于理解的方法在那里处理它们,它会告诉你它是什么分布以及什么参数可以你期待。
  • FWIW,scipy stats 中的每个分布都有一个属性shapes
  • 感谢您的回复;最后我不得不手动完成,因为shapes 参数仍然没有给我一个对发布有效的名称。

标签: python numpy scipy


【解决方案1】:

Warren Weckesser 和我开发了一个更强大的解决方案:

import sys
import scipy.stats

def list_parameters(distribution):
    """List parameters for scipy.stats.distribution.
    # Arguments
        distribution: a string or scipy.stats distribution object.
    # Returns
        A list of distribution parameter strings.
    """
    if isinstance(distribution, str):
        distribution = getattr(scipy.stats, distribution)
    if distribution.shapes:
        parameters = [name.strip() for name in distribution.shapes.split(',')]
    else:
        parameters = []
    if distribution.name in scipy.stats._discrete_distns._distn_names:
        parameters += ['loc']
    elif distribution.name in scipy.stats._continuous_distns._distn_names:
        parameters += ['loc', 'scale']
    else:
        sys.exit("Distribution name not found in discrete or continuous lists.")
    return parameters

可以在here找到讨论。

【讨论】:

    【解决方案2】:

    这段代码演示了ev-br 在他的回答中提供的信息,以防其他人登陆这里。

    >>> from scipy import stats
    >>> dists = ['alpha', 'anglit', 'arcsine', 'beta', 'betaprime', 'bradford', 'norm']
    >>> for d in dists:
    ...     dist = getattr(scipy.stats, d)
    ...     dist.name, dist.shapes
    ... 
    ('alpha', 'a')
    ('anglit', None)
    ('arcsine', None)
    ('beta', 'a, b')
    ('betaprime', 'a, b')
    ('bradford', 'c')
    ('norm', None)
    

    我要指出的是,shapes 参数对于由位置和比例参数化的正态分布等分布产生的值为 None。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 2011-10-09
      • 2016-10-21
      相关资源
      最近更新 更多