使用 Numpy/Python,是否可以从单个函数调用中返回均值和方差?
我知道我可以分开做,但是计算样本标准差需要平均值。因此,如果我使用单独的函数来获得均值和方差,我会增加不必要的开销。
我曾尝试在此处查看 numpy 文档(http://docs.scipy.org/doc/numpy/reference/routines.statistics.html),但没有成功。
使用 Numpy/Python,是否可以从单个函数调用中返回均值和方差?
我知道我可以分开做,但是计算样本标准差需要平均值。因此,如果我使用单独的函数来获得均值和方差,我会增加不必要的开销。
我曾尝试在此处查看 numpy 文档(http://docs.scipy.org/doc/numpy/reference/routines.statistics.html),但没有成功。
您不能将已知均值传递给np.std
or np.var
,您必须等待新的标准库statistics
模块,但同时您可以使用以下公式节省一点时间:
In [329]: a = np.random.rand(1000)
In [330]: %%timeit
.....: a.mean()
.....: a.var()
.....:
10000 loops, best of 3: 80.6 µs per loop
In [331]: %%timeit
.....: m = a.mean()
.....: np.mean((a-m)**2)
.....:
10000 loops, best of 3: 60.9 µs per loop
In [332]: m = a.mean()
In [333]: a.var()
Out[333]: 0.078365856465916137
In [334]: np.mean((a-m)**2)
Out[334]: 0.078365856465916137
如果您真的想加快速度,请尝试np.dot
进行平方和求和(因为这就是点积):
In [335]: np.dot(a-m,a-m)/a.size
Out[335]: 0.078365856465916137
In [336]: %%timeit
.....: m = a.mean()
.....: c = a-m
.....: np.dot(c,c)/a.size
.....:
10000 loops, best of 3: 38.2 µs per loop
您还可以通过利用信号的均值、方差和功率之间的关系来避免减法:
In [7]: import numpy as np
In [8]: a = np.random.rand(1000)
In [9]: %%timeit
...: a.mean()
...: a.var()
...:
10000 loops, best of 3: 24.7 us per loop
In [10]: %%timeit
...: m = a.mean()
...: np.mean((a-m)**2)
...:
100000 loops, best of 3: 18.5 us per loop
In [11]: %%timeit
...: m = a.mean()
...: power = np.mean(a ** 2)
...: power - m ** 2
...:
100000 loops, best of 3: 17.3 us per loop
In [12]: %%timeit
...: m = a.mean()
...: power = np.dot(a, a) / a.size
...: power - m ** 2
...:
100000 loops, best of 3: 9.16 us per loop
我不认为 NumPy 提供了一个返回均值和方差的函数。
但是,SciPy 提供了scipy.stats.norm.fit()
返回样本均值和标准差的函数。该函数以其将正态分布拟合到样本的更具体目的而命名。
例子:
>>> import scipy.stats
>>> scipy.stats.norm.fit([1,2,3])
(2.0, 0.81649658092772603)
请注意,fit()
这不会将贝塞尔校正应用于标准偏差,因此如果您想要该校正,则必须乘以适当的因子。