获取scipy.stats分布的参数名称

6

我正在编写一个脚本,使用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-Value以获取最佳拟合分布。现在,每个分布都会返回一组特定的参数ps,每个参数都有其名称等(例如,对于“alpha”,它将是alpha,而对于“norm”它们将是mean和std)。
是否有一种方法可以在scipy.stats中获得估计参数的名称?
提前感谢您。

在我看来,由于您知道使用的是哪个发行版,请明确地进行操作... 在您的ps周围创建一个包装器,并在那里处理它们,使用易于理解的方法告诉您它是哪个发行版以及可以期望什么参数。 - user3012759
3
对于Scipy统计库中的每个分布,都有一个名为"shapes"的属性。 - ev-br
感谢回复;最终我不得不手动完成,因为“shapes”参数仍然没有给我一个可以用于出版物的有效名称。 - user1695639
2个回答

3
沃伦·韦克塞尔和我开发了一种更强大的解决方案:
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

讨论可以在此处找到 这里


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参数会产生空值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接