我在python上查看了一些分发函数:
Uniform,Binomial,Bernoulli,normal distribution
我发现scipy和numpy都有相同的功能。
>>> from scipy.stats import binom
>>> rv = binom(n, p)
>>> import numpy as np
>>> s = np.random.binomial(n, p, 1000)
查看代码我发现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 Random模块:https://docs.scipy.org/doc/numpy/reference/routines.random.html
Scipy stats模块:https://docs.scipy.org/doc/scipy/reference/stats.html
我发现了两个模块之间的一些基本区别:Difference between random draws from scipy.stats....rvs and numpy.random
答案 0 :(得分:4)
scipy生成随机变量,而numpy生成随机数。当您使用np.random.binomial(n, p, 1)
时,它只是随机变量realization的:
在概率和统计中,a的实现或观察值 随机变量是实际观察到的值(实际上是什么 发生过)。随机变量本身就是决定如何进行的过程 观察来了。从中计算的统计量 通常会调用未部署统计模型的实现 "经验",如经验分布函数或经验 概率。
一般来说,numpy的作用是多次掷骰子。另一方面,scipy告诉你连续获得两个六的概率是多少。如果您将硬币翻转一百次,那么预期的尾巴的数量是多少?
当然,您可以在numpy中运行模拟并近似这些值(翻转一百万次硬币,尾巴数量约为50万)。然而,这只是实验的结果。随机变量告诉你理论解决方案(对于二项式,这是 n 次 p 其中n是试验次数,p是概率。所以你会得到500万。
这是一个小小的演示:
binom(n, p)
获取随机变量的平均值和标准差:
import scipy.stats as ss
import numpy as np
n, p = 10**4, 0.3
rv = ss.binom(n, p)
从该分发中生成100个随机数:
rv.mean()
Out: 3000.0
rv.std()
Out: 45.825756949558397
计算平均值和标准差:
prng = np.random.RandomState(0)
random_numbers = prng.binomial(n, p, size=100)
生成另一个100:
random_numbers.mean()
Out: 3004.8099999999999
random_numbers.std()
Out: 47.336813369723146
不同的均值和标准差:
prng = np.random.RandomState(1)
random_numbers = prng.binomial(n, p, size=100)
进一步增加样本量,均值和标准差将接近分布均值和分布标准差:
random_numbers.mean()
Out: 2990.96
random_numbers.std()
Out: 46.245631145006548
答案 1 :(得分:3)
scipy库提供了哪些附加功能?numpy中没有?
如果您查看其中一个单独发行版的文档(例如beta),则可以看到其他功能。 numpy函数只允许绘制随机值。 scipy发行版有许多额外的方法可用于其他事物,如百分位数,累积分布函数以及平均值和标准差等统计数据。
scipy给你的一些信息不能直接从numpy函数中计算出来。 numpy函数仅为您提供随机绘制的单个值,但scipy以数学方式表示分布,并且可以在不实际绘制任何值的情况下计算某些内容。例如,scipy分布返回的许多统计数据都是用精确的数学公式计算的。您可以在链接到的源中看到,例如,binom_gen._stats直接计算均值,stdev等。要使用numpy找到平均值,你必须绘制一堆值(理论上是无限数)并计算它们的平均值; scipy抽象地抽象而不绘制任何值。 scipy发行版揭示了numpy无法获得的分布的数学细节。