Vik*_*ngh 7 python numpy scipy
我正在研究 python 中的一些分布函数:
均匀分布、二项分布、伯努利分布、正态分布
我发现 scipy 和 numpy 中都存在几乎相同的功能。
>>> from scipy.stats import binom
>>> rv = binom(n, p)
>>> import numpy as np
>>> s = np.random.binomial(n, p, 1000)
Run Code Online (Sandbox Code Playgroud)
回顾我发现 scipy 在内部使用 numpy 的代码:
https://github.com/scipy/scipy/blob/master/scipy/stats/_discrete_distns.py
https://github.com/numpy/numpy/blob/master/numpy/random/mtrand/distributions.c
所以,我的问题是拥有 2 个相同分布函数的副本的主要动机是什么?
scipy 库提供了哪些 numpy 中没有的附加功能?
每个模块中方法的完整列表在这里:
Numpy 随机模块:https : //docs.scipy.org/doc/numpy/reference/routines.random.html
Scipy 统计模块:https ://docs.scipy.org/doc/scipy/reference/stats.html
我发现参考了两个模块之间的一些基本区别:Difference between random draws from scipy.stats....rvs and numpy.random
scipy 生成随机变量,而 numpy 生成随机数。当你使用 时np.random.binomial(n, p, 1),它只是随机变量 ( ) 的一个实现binom(n, p):
在概率和统计中,随机变量的实现或观察值是实际观察到的值(实际发生的情况)。随机变量本身是决定观察结果的过程。在不部署统计模型的情况下根据实现计算的统计量通常称为“经验”,如经验分布函数或经验概率。
一般来说,numpy 所做的是多次掷骰子。另一方面,scipy 告诉您连续获得两个 6 的概率是多少。如果你抛硬币一百次,预期的反面数是多少?
当然,您可以在 numpy 中运行模拟并近似这些值(掷硬币一百万次,反面的数量约为 50 万)。然而,这只是一个实验的结果。一个随机变量告诉你理论解(对于二项式,这是n乘以p,其中 n 是试验次数,p 是概率。所以你会得到 50 万。
这是一个小演示:
import scipy.stats as ss
import numpy as np
n, p = 10**4, 0.3
rv = ss.binom(n, p)
Run Code Online (Sandbox Code Playgroud)
获取随机变量的均值和标准差:
rv.mean()
Out: 3000.0
rv.std()
Out: 45.825756949558397
Run Code Online (Sandbox Code Playgroud)
从该分布生成 100 个随机数:
prng = np.random.RandomState(0)
random_numbers = prng.binomial(n, p, size=100)
Run Code Online (Sandbox Code Playgroud)
计算均值和标准差:
random_numbers.mean()
Out: 3004.8099999999999
random_numbers.std()
Out: 47.336813369723146
Run Code Online (Sandbox Code Playgroud)
再生成 100 个:
prng = np.random.RandomState(1)
random_numbers = prng.binomial(n, p, size=100)
Run Code Online (Sandbox Code Playgroud)
不同的均值和标准差:
random_numbers.mean()
Out: 2990.96
random_numbers.std()
Out: 46.245631145006548
Run Code Online (Sandbox Code Playgroud)
进一步增加样本量,均值和标准差将接近分布均值和分布标准差:
random_numbers = prng.binomial(n, p, size=10**7)
random_numbers.mean()
Out: 2999.9639155
random_numbers.std()
Out: 45.854409513250303
Run Code Online (Sandbox Code Playgroud)
scipy 库提供了哪些 numpy 中没有的附加功能?
如果您查看单个发行版(例如beta)的文档,您可以看到附加功能。numpy 函数只允许绘制随机值。scipy 分布有很多额外的方法来处理其他事情,比如百分位数、累积分布函数以及平均值和标准差等统计数据。
scipy 为您提供的某些信息无法直接从 numpy 函数中计算出来。numpy 函数只为您提供单独的随机绘制的值,但 scipy 以数学方式表示分布,并且可以在不实际绘制任何值的情况下计算一些东西。例如,scipy 分布返回的许多统计数据都是使用精确的数学公式计算的。您可以在链接到的源中看到,例如, binom_gen._stats 直接计算均值、标准差等。要使用 numpy 找到平均值,您必须绘制一堆值(理论上是无限数)并计算它们的平均值;scipy 是抽象的,没有绘制任何值。scipy 分布公开了通过 numpy 无法获得的分布的数学细节。
| 归档时间: |
|
| 查看次数: |
1879 次 |
| 最近记录: |