标签:histogram 相关 blog format details ima 产生 def amp
python_statistics and probability
https://blog.csdn.net/howhigh/article/details/78007317
https://www.jb51.net/article/152713.htm
1. 常用的统计分布
用Python统计模拟的方法,介绍四种常用的统计分布,包括离散分布:二项分布和泊松分布,以及连续分布:指数分布和正态分布,最后查看人群的身高和体重数据所符合的分布。
首先导入python相关模块:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline %config InlineBackend.figure_format = ‘retina‘
随机数
计算机发明后,便产生了一种全新的解决问题的方式:使用计算机对现实世界进行统计模拟。该方法又称为“蒙特卡洛方法(Monte Carlo method)”,起源于二战时美国研制原子弹的曼哈顿计划,它的发明人中就有大名鼎鼎的冯·诺依曼。蒙特卡洛方法的名字来源也颇为有趣,相传另一位发明者乌拉姆的叔叔经常在摩洛哥的蒙特卡洛赌场输钱,赌博是一场概率的游戏,故而以概率为基础的统计模拟方法就以这一赌城命名了。
使用统计模拟,首先要产生随机数,在Python中,numpy.random 模块提供了丰富的随机数生成函数。比如生成0到1之间的任意随机数:
np.random.random(size=5) # size表示生成随机数的个数
结果:
又比如生成一定范围内的随机整数:
np.random.randint(1, 10, size=5) # 生成5个1到9之间的随机整数
结果:
下面介绍使用python生成pdf的方法:
下面介绍使用python生成cdf的方法:
from scipy import stats import matplotlib.pyplot as plt import numpy as np import seaborn as sns arr = np.random.normal(size=100) plt.subplot(121) hist, bin_edges = np.histogram(arr) cdf = np.cumsum(hist) plt.plot(cdf) plt.subplot(122) cdf = stats.cumfreq(arr) plt.plot(cdf[0]) plt.show()
在更多时候,需要把pdf和cdf放在一起,可以更好的显示数据分布。
from scipy import stats import matplotlib.pyplot as plt import numpy as np import seaborn as sns arr = np.random.normal(size=100) hist, bin_edges = np.histogram(arr) width = (bin_edges[1] - bin_edges[0]) * 0.8 plt.bar(bin_edges[1:], hist/max(hist), width=width, color=‘#5B9BD5‘) cdf = np.cumsum(hist/sum(hist)) plt.plot(bin_edges[1:], cdf, ‘-*‘, color=‘#ED7D31‘) plt.xlim([-2, 2]) plt.ylim([0, 1]) plt.grid() plt.show()
1) 二项分布
二项分布(伯努利分布)是n个独立的是/非试验中成功的次数的概率分布,其中每次试验的成功概率为p。这是一个离散分布,所以使用概率质量函数(PMF)来表示k次成功的概率:
最常见的二项分布就是投硬币问题了,每次投一个硬币,投n次硬币,正面朝上次数就满足该分布。size(投掷次数)可以从10~10000. 看图形的变化。
sample=np.random.binomial(1,0.5,size=100)
plt.hist(sample,bins=50)
下面我们使用计算机模 拟的方法,产生10000个符合(n,p)的二项分布随机数,相当于进行10000次实验,每次实验投掷了n(10)枚硬币,正面朝上的硬币数就是所产生的随机数。同时使用直方图函数绘制出二项分布的PMF图。
def plot_binomial_PDF(n,p): ‘‘‘绘制二项分布的概率质量函数‘‘‘ sample = np.random.binomial(n,p,size=10000) # 产生10000个符合二项分布的随机数 bins = np.arange(n+2) plt.hist(sample, bins=bins, align=‘left‘, normed=True, rwidth=0.1) # 绘制直方图 #设置标题和坐标 plt.title(‘Binomial PMF with n={}, p={}‘.format(n,p)) plt.xlabel(‘number of successes‘) plt.ylabel(‘probability‘)
def plot_binomial_CDF(sample):
hist,bin_edges=np.histogram(sample)
cdf=np.cumsum(hist)
plt.plot(cdf)
plot_binomial(10, 0.5)
sample=np.random.binomial(10,0.5,size=1000)
plot_binomial_CDF(sample)
投10枚硬币,如果正面或反面朝上的概率相同,即p=0.5, 那么出现正面次数的分布符合上图所示的二项分布。该分布左右对称,最有可能的情况是正面出现5次。
但如果这是一枚作假的硬币呢?比如正面朝上的概率p=0.2,或者是p=0.8,又会怎样呢?我们依然可以做出该情况下的PMF图。
这时的分布不再对称了,正如我们所料,当概率p=0.2时,正面最有可能出现2次;而当p=0.8时,正面最有可能出现8次。
二项分布的例子:抛掷10次硬币,恰好两次正面朝上的概率是多少? --> k=2, n = 10, p=0.5
1 def binom_pmf(): 2 n = 10 #独立实验次数 3 p = 0.5 #每次正面朝上概率 4 k = np.arange(0,11) #0-10次正面朝上概率 5 binomial = stats.binom.pmf(k,n,p) 6 print(binomial) 7 print(sum(binomial)) 8 print(binomial[2]) 9 plt.plot(k, binomial,‘o-‘) 10 plt.title(‘Binomial: n=%i , p=%.2f‘ % (n,p),fontsize=15) 11 plt.xlabel(‘Number of successes‘) 12 plt.ylabel(‘Probability of success‘,fontsize=15) 13 plt.show()
[0.00097656 0.00976563 0.04394531 0.1171875 0.20507813 0.24609375
0.20507813 0.1171875 0.04394531 0.00976563 0.00097656]
1.0000000000000009
0.04394531249999999
2) 泊松分布
泊松分布用于描述单位时间内随机事件发生次数的概率分布,它也是离散分布,其概率质量函数PMF为:
比如你在等公交车,假设这些公交车的到来是独立且随机的(当然这不是现实),前后车之间没有关系,那么在1小时中到来的公交车数量就符合泊松分布。同样使用统计模拟的方法绘制该泊松分布,这里假设每小时平均来6辆车(即上述公式中lambda=6)。
标签:histogram 相关 blog format details ima 产生 def amp
原文地址:https://www.cnblogs.com/tlfox2006/p/12639874.html