关于python:如何从冻结的spich.stats分布中获取参数参数?

How to get parameter arguments from a frozen spicy.stats distribution?

冻结分布

scipy.stats中,您可以创建一个冻结分布,它允许为该实例永久设置分布的参数化(形状、位置和比例)。

例如,可以使用alocscale参数创建gamma分布(scipy.stats.gamma),并冻结它们,以便在每次需要分布时不必传递它们。

1
2
3
4
5
6
7
8
9
10
11
12
13
import scipy.stats as stats

# Parameters for this particular gamma distribution
a, loc, scale = 3.14, 5.0, 2.0

# Do something with the general distribution parameterized
print 'gamma stats:', stats.gamma(a, loc=loc, scale=scale).stats()

# Create frozen distribution
rv = stats.gamma(a, loc=loc, scale=scale)

# Do something with the specific, already parameterized, distribution
print 'rv stats   :', rv.stats()
1
2
gamma stats: (array(11.280000000000001), array(12.56))
rv stats   : (array(11.280000000000001), array(12.56))

是否可以访问rv参数?

由于此功能很可能不会传递参数,因此是否有一种方法可以从稍后的冻结分布(rv)中获取这些值?


访问rv冻结参数

是的,用于创建冻结分发的参数在分发实例中可用。它们存储在argskwds属性中。这将取决于分发的实例是使用位置参数还是关键字参数创建的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import scipy.stats as stats

# Parameters for this particular alpha distribution
a, loc, scale = 3.14, 5.0, 2.0

# Create frozen distribution
rv1 = stats.gamma(a, loc, scale)
rv2 = stats.gamma(a, loc=loc, scale=scale)

# Do something with frozen parameters
print 'positional and keyword'
print 'frozen args : {}'.format(rv1.args)
print 'frozen kwds : {}'.format(rv1.kwds)
print
print 'positional only'
print 'frozen args : {}'.format(rv2.args)
print 'frozen kwds : {}'.format(rv2.kwds)
1
2
3
4
5
6
7
positional and keyword
frozen args : (3.14, 5.0, 2.0)
frozen kwds : {}

positional only
frozen args : (3.14,)
frozen kwds : {'loc': 5.0, 'scale': 2.0}

奖金:处理argskwds的私有方法

有一个私有方法,.dist._parse_args(),它处理参数传递的两种情况,并返回一致的结果。

1
2
3
4
5
6
7
8
9
# Get the original parameters regardless of argument type
shape1, loc1, scale1 = rv1.dist._parse_args(*rv1.args, **rv1.kwds)
shape2, loc2, scale2 = rv2.dist._parse_args(*rv2.args, **rv2.kwds)

print 'positional and keyword'
print 'frozen parameters: shape={}, loc={}, scale={}'.format(shape1, loc1, scale1)
print
print 'positional only'
print 'frozen parameters: shape={}, loc={}, scale={}'.format(shape2, loc2, scale2)
1
2
3
4
5
positional and keyword
frozen parameters: shape=(3.14,), loc=5.0, scale=2.0

positional only
frozen parameters: shape=(3.14,), loc=5.0, scale=2.0

告诫

当然,使用私有方法通常是不好的做法,因为从技术上讲,内部API总是可以更改的,但是,有时它们提供了很好的特性,如果事情发生了变化,并且在python中没有真正私有的东西,则很容易重新实现。