欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

常用离散型及连续性概率分布笔记概要(附py调用过程)

程序员文章站 2022-04-14 20:37:48
...

常见离散型概率分布

1、 二项分布
伯努利实验:
(1)实验只能有两种结果,be or not to be
(2)实验互相独立的,且可重复进行n次
(3)每次实验互不影响

二项分布:
在n次伯努利实验中,单次实验发生概率为p的结果发生的次数

2、泊松分布
泊松分布描述的是一定时间段或空间区域或其它单位内某个事件发生的次数。

3、超几何分布
泊松分布对应的场景是有放回抽样,超几何分布描述的场景则是不放回抽样。

常见连续性概率分布

1、正态分布
2、均匀分布
3、卡方分布
……

$ python实现(下附代码)
注意:
1、本次使用Anaconda环境运行python,运行系统为windows10
2、因为matplot版本的原因,在使用destiny的地方如果有报错的话,可以改为normed
常用离散型及连续性概率分布笔记概要(附py调用过程)
常用离散型及连续性概率分布笔记概要(附py调用过程)
常用离散型及连续性概率分布笔记概要(附py调用过程)
-----part.01-----

#用python实现样本集设置、计算PDF/PMF

import numpy
#用numpy生成样本量为100,n为10,p为0.5的二项分布样本集
s1 = numpy.random.binomial(n=10, p=0.5, size=100)
s1
#用numpy生成样本量为100,p为0.5的泊松分布样本集
s2 = numpy.random.poisson(lam=1, size=100)
s2
#用numpy生成样本量为100,U(0,1)的均匀分布样本集,左闭右开
s3 = numpy.random.uniform(low=0, high=1, size=100)
s3
#用numpy生成样本量为100,N(0,1)的正态分布样本集
#使用normal函数自定义均值、样本差
s41 = numpy.random.normal(loc=0, scale=1, size=100)

#使用standard_normal函数
s42 = numpy.random.standard_normal(size=100)

print(s41)
print(s42)
#生成样本量为100的,符合E(1/2)指数分布的样本集,指令内参数为指数分布参数λ的倒数
s5 = numpy.random.exponential(scale=2, size=100)
s5
#计算离散型随机变量PMF、连续性随机变量PDF
from scipy import stats
#计算二项分布B(10, 0.5)的随机变量概率质量函数(PMF)、分布函数CDF
x1 = range(11)
p1 = stats.binom.pmf(x1, n=10, p=0.5)
fb1 = stats.binom.cdf(x1, n=10, p=0.5)

print("PMF: ",p1)
print("CDF: ",fb1)
#计算泊松分布P(1)的PMF、CDF
x2 = range(11)
p2 = stats.poisson.pmf(x2, mu=1)
fb2 = stats.poisson.cdf(x2, mu=1)

print("PMF: ",p2)
print("CDF: ",fb2)
#计算均匀分布U(0,1)的PDF、CDF
x3 = numpy.linspace(0, 1, 100)
p3 = stats.uniform.pdf(x3, loc=0, scale=1)
fb3 = stats.uniform.cdf(x3, loc=0, scale=1)

print("PDF: ",p3)
print("CDF: ",fb3)
#计算正态分布N(0,1)的PDF、CDF
x4 = numpy.linspace(-3,3,100)
p4 = stats.norm.pdf(x4,loc=0,scale=1)
fb4 = stats.norm.pdf(x4,loc=0,scale=1)

print("PDF: ",p4)
print("CDF: ",fb4)
#计算指数分布E(1)的PDF、CDF
x5 = numpy.linspace(0,10,100)
p5 = stats.expon.pdf(x5,loc=0,scale=1)
fb5 = stats.expon.pdf(x5,loc=0,scale=1)

print("PDF: ",p5)
print("CDF: ",fb5)

-----part.02-----

#离散型概率分布演示,二项分布与泊松分布
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
#比较n=10,p=0.5的二项分布的真实概率质量和10000次随机抽样的结果
x1 = range(11)
t1 = stats.binom.rvs(10,0.5,size=10000)
p1 = stats.binom.pmf(x1, 10, 0.5)

fig, ax=plt.subplots(1,1)
sns.distplot(t1, bins=10, hist_kws={'normed':True}, kde=False, label='Distplot from 10000 samples') #教材参数名为density,版本问题报错后改为normed
sns.scatterplot(x1,p1,color='purple')
sns.lineplot(x1,p1,color='purple', label='True mass density')
plt.title('Binomial distribution')
plt.legend(bbox_to_anchor=(1.05, 1))
plt.show()
#比较λ=2的泊松分布的真实概率质量和10000次随机抽样的结果
x2 = range(11)
t2 = stats.poisson.rvs(2, size=10000)
p2 = stats.poisson.pmf(x2, 2)

fig, ax = plt.subplots(1,1)
sns.distplot(t2, bins=10, hist_kws={'normed':True}, kde=False, label='Distplot from 10000 samples')
sns.scatterplot(x2, p2, color='purple')
sns.lineplot(x2, p2, color='purple', label='True mas density')
plt.title('Poisson distribution')
plt.legend()
plt.show()
#比较不同参数λ对应的概率质量函数,可以验证随着参数增大,泊松分布开始逐渐变得对称,分布也越来越均匀,趋近于正态分布
x_1 = range(50)
fig, ax = plt.subplots()
for lam in [1,2,5,10,20]:
    p_1=stats.poisson.pmf(x_1, lam)
    sns.lineplot(x_1, p_1, label='lamda= '+str(lam))
plt.title('Poisson distribution')
plt.legend()
plt.show()
#比较U(0,1)的均匀分布的真实概率密度和10000次随机抽样的结果
import numpy

x3 = numpy.linspace(0,1,100)
t3 = stats.uniform.rvs(0,1,size=10000)
p3 = stats.uniform.pdf(x3,0,1)

fig, ax = plt.subplots(1,1)
sns.distplot(t3,bins=10,hist_kws={'normed':True}, kde=False, label='Distplot from 10000 samples')

sns.lineplot(x3, p3, color='purple', label='True mass density')
plt.title('Uniform distribution')   #教材pdf代码里面uniform多了一个l
plt.legend(bbox_to_anchor=(1.05,1))
plt.show()
#比较N(0,1)的正态分布的真实概率密度和10000次随机抽样的结果
x4 = numpy.linspace(-3,3,100)
t4 = stats.norm.rvs(0,1,size=10000)
p4 = stats.norm.pdf(x4,0,1)

fig, ax = plt.subplots(1,1)
sns.distplot(t4,bins=100,hist_kws={'normed':True}, kde=False, label='Displot from 10000 samples')

sns.lineplot(x4, p4, color='purple', label='True mass density')
plt.title('Normal distribution')
plt.legend(bbox_to_anchor=(1.05,1))
plt.show()
#比较不同均值和标准差组合的正态分布的概率密度函数
x_2 = numpy.linspace(-6,6,100)
p_2 = stats.norm.pdf(x_2, 0, 1)

fig, ax=plt.subplots()
for mean, std in [(0,1), (0,2), (3,1)]:
    p_2 = stats.norm.pdf(x_2, mean, std)
    sns.lineplot(x_2, p_2, label='Mean: '+str(mean)+', std: '+str(std))
plt.title('Normal distribution')
plt.legend()
plt.show()
#比较E(1)的指数分布的真实概率密度和10000次随机抽样的结果
x5 = numpy.linspace(0,10,100)
t5 = stats.expon.rvs(0,1,size=10000)
p5 = stats.expon.pdf(x5, 0, 1)

fig, ax = plt.subplots(1, 1)
sns.distplot(t5, bins=100, hist_kws={'normed':True}, kde=False, label='Distplot from 10000 samples')
sns.lineplot(x5, p5, color='purple', label='True mass density')
plt.title('Exponential distribution')
plt.legend(bbox_to_anchor=(1,1))
plt.show()
#比较不同参数的指数分布的概率密度函数
x_3 = numpy.linspace(0,10,100)
fig, ax=plt.subplots()
for scale in [0.2,0.5,1,2,5]:
    p_3 = stats.expon.pdf(x_3, scale=scale)
    sns.lineplot(x_3, p_3, label='lamda= '+str(1/scale))
plt.title('Exponential distribution')
plt.legend()
plt.show()

需要注意的是,在anaconda环境下并没有安装seaborn库,需要另外在cmd执行pip install seaborn来安装库,联网状态,安装数分钟即可

-----part.03-----

#卡方检验,检验两组类别变量是相关的还是独立的
from scipy.stats import chi2_contingency
table = [[10,20,30],[6,9,17]]
stat, p, dof, expected = chi2_contingency(table)
print('stat=%.3f, p=%.3f'%(stat, p))
if p>0.05:
    print('Probably independent')
else:
    print('Probably dependent')

#正态分布

import numpy as np
from scipy.stats import shapiro
data_nonnormal = np.random.exponential(size=100)
data_normal = np.random.normal(size=100)

def normal_judge(data):
    stat, p=shapiro(data)
    if p>0.05:
        return 'stat={:.3f}, p={:.3f}, probably gaussian'.format(stat,p)
    else:
        return 'stat={:.3f}, p={:.3f}, probably not gaussian'.format(stat,p)

normal_judge(data_nonnormal)

normal_judge(data_normal)
#T测试
from scipy.stats import ttest_ind
import numpy as np
data1 = np.random.normal(size=10)
data2 = np.random.normal(size=10)
start, p = ttest_ind(data1, data2)
print('stat=%.3f, p=%.3f'%(stat,p))
if p>0.05:
    print('Probably the same distribution')
else:
    print('Probably different distributions')
#ANOVA,与T检验类似
from scipy.stats import f_oneway
import numpy as np
data1 = np.random.normal(size=10)
data2 = np.random.normal(size=10)
data3 = np.random.normal(size=10)
stat, p = f_oneway(data1, data2, data3)

print('stat=%.3f, p=%.3f'%(stat,p))
if p>0.05:
    print('Probably the same distribution')
else:
    print('Probably different distributions')
#Mann-Whitney U Test
from scipy.stats import mannwhitneyu
data1 = [0.873,2.817,2.121,-0.945,-0.055,-1.436,0.360,-1.478,-1.637,-1.869]
data2 = [1.142,-0.432,-0.938,-0.729,-0.846,-0.157,0.500,1.183,-1.075,-0.169]
stat, p = mannwhitneyu(data1, data2)
print('stat=%.3f, p=%.3f'%(stat,p))
if p>0.05:
    print('Probably the same distribution')
else:
    print('Probably different distributions')

-----附录-----
在安装图可视化第三方库seaborn过程中遇到的问题
常用离散型及连续性概率分布笔记概要(附py调用过程)
如图所示,使用seaborn的时候遇到报错,然后去查一下,发现系统没有安装这个库,所以在cmd命令提示符内安装pip install seaborn,果不其然,又报错了:

pip install seaborn

常用离散型及连续性概率分布笔记概要(附py调用过程)
查找原因,是因为我的系统是win10,对C:/program files/Anaconda目录没有访问权限。然后,尝试两个方法,第一个是在命令提示符下面执行命令

conda create -n my_root --clone=C:\PrograData\Anaconda3

然后……失败了
常用离散型及连续性概率分布笔记概要(附py调用过程)
第二个方法,直接打开目标文件夹,右键,点属性,设置文件夹权限,loading约十来分钟
常用离散型及连续性概率分布笔记概要(附py调用过程)
设置完毕后,尝试安装seaborn,提示conda需要更新,那就先更新conda

conda pip install

常用离散型及连续性概率分布笔记概要(附py调用过程)
conda已经更新到最新版本了,最后安装我们的seaborn,运行成功!

pip install seaborn

常用离散型及连续性概率分布笔记概要(附py调用过程)