天天看点

python 服从正太分布 离散情况 下 的概率密度函数python 服从正太分布 离散情况 下 的概率密度函数

python 服从正太分布 离散情况 下 的概率密度函数

  1. scipy.stats库是分布函数库, 包含正太分布,泊松分布,卡方分布等
  2. 导入scipy.stats库以后, 应用函数norm生成服从正太分布的概率密度函数,

    具体法是: scipy.stats.norm(均值, 标准差)

  3. 应用函数rvs()产生服从正太分布的随机样本; 具体用法是: scipy.stats.rvs(样本个数)
  4. 概率密度函数pdf() 用于求出某样本发生的概率; 具体用法是: pdf(样本), 结果为样本发生的概率
  5. 累积密度函数cdf()是概率密度函数的积分。

    可用于算出正太分布曲线任意两点a,b(b>a)围成的区间的面积, 即面积等于随机数发生在这区间的概率(密度);

    用法:面积=scipy.stats.norm.cdf(b)-scipy.stats.norm.cdf(a) ; 这是使用累积分布函数cdf算出来的

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats # 导入分布函数库; 另一种导入形式 import scipy.stats
import pandas as pd
import seaborn as sns
import matplotlib

matplotlib.rcParams['axes.unicode_minus']=False#解决保存图像时负号'-'显示为方块的问题
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体

# 正太分布曲线关于 x轴=均值 处对称; 即 x轴=均值时,结果为峰值(最大概率)
# 标准差越大,则分峰值越小(即最大概率越小),曲线越陡
nd = stats.norm(5,3) # 生成均值为5,标准差3的正态分布

x = np.linspace(-10,10,num=15) # num的数值要与下面生成随机样本数量相等
data = nd.rvs(15) # 产生服从正太分布的随机15个样本
print(data) # 输出随机生成的数

plt.figure(1)
plt.scatter(x,y=data) # 绘制散点图,查看数值分布
plt.xlabel('x轴无意义') # x轴无意义,但必须设置,因为画图需要
plt.ylabel('随机样本的大小')
plt.grid(b= True, axis='y') # 显示网格y轴
plt.title('散点图')

se = np.std(data,ddof=1)/np.sqrt(15) # 标准误 sqrt(样本量)

print('the standard error is {0}'.format(se)) # 输出标准误的值,标准误用于描述总体均值和样本均值的差距
# print('thr standard error is %f'%se)

# 直方图
plt.figure(2)
plt.hist(data,bins=100) # 划分为150个柱子
plt.title('直方图')
plt.xlabel('随机样本的大小')
plt.ylabel('随机样本的个数')
plt.show()


# 算出随机生成5这个数的概率, 因为5等于设定的均值,所以pdf(5)的结果就是正太分布曲线的峰值,即最大概率对应的数值
print("生成5的概率={}".format(nd.pdf(5))) # pdf()是概率密度函数
print("生成10的概率={}".format(nd.pdf(-0)))
print("生成-10的概率={}".format(nd.pdf(-10)))

# 算出正太分布曲线任意两点a,b(b>a)围成的区间的面积, 即面积等于随机数发生在这区间的概率(密度);
# 面积=scipy.stats.norm.cdf(b)-scipy.stats.norm.cdf(a) ; 这是使用累积分布函数cdf算出来的
print('*'*100)
print(nd.cdf(8)-nd.cdf(2)) # 均值5加减一个标准差3,然后算出该范围的概率密度

           

运行程序结果:

生成服从正太分布的15个随机样本

[ 6.48630578 5.60762651 3.51681836 5.3242151 2.57772191 2.1317888

3.00916004 8.47931171 2.53629108 -1.64630161 2.35756654 0.99879104

-0.99562134 7.52357158 6.18599851]

其散点图如下:

python 服从正太分布 离散情况 下 的概率密度函数python 服从正太分布 离散情况 下 的概率密度函数
python 服从正太分布 离散情况 下 的概率密度函数python 服从正太分布 离散情况 下 的概率密度函数

如下是结合2张图和15个随机样本的讲解:

  1. 散点图图标1,2,3,4的点分别一一对应于直方图1,2,3,4这些柱,
  2. 可以看出有2个变量小于0, 分别为点1,2; 其值为[ -1.64630161, -0.99562134]
  3. 有一个数值约为1, 在图中为点3, 其值为[ 0.99879104 ], 其余的正数值均大于2
  4. 有一个数值大于8, 在图中为点4 ,其值为[ 8.47931171 ]
  5. 通过直方图的最高柱子, 可以看出在2附近有两个重复的值, 其值为[ 2.53629108 , 5.3242151 ]

    但是这两个数值为什么不相等,而是接近相等?

    因为 : x 轴并不是划分为无穷大个小区间

由于样本量不够大, 所有柱形图并不明显呈现出正太分布

所以: 标准误就很大

the standard error is 0.7648986165499617

以下可以看出: 越靠近均值, 发生的概率越大

生成5的概率=0.1329807601338109

生成10的概率=0.03315904626424956

生成-10的概率=4.955731715780993e-07 (非常小,几乎可以忽略)

发生在2和8之间的概率为:

0.6826894921370859

下面: 调高样本量为2000, 可以看出柱形图明显呈正态分布图了

即 rvs(2000)

python 服从正太分布 离散情况 下 的概率密度函数python 服从正太分布 离散情况 下 的概率密度函数

由于样本量增大, 标准误明显下降,也就是说: 样本越大, 越能反应出总体数量的特征

the standard error is 0.06557922041493411

而生成其他数值的概率基本不变

生成5的概率=0.1329807601338109

生成10的概率=0.03315904626424956

生成-10的概率=4.955731715780993e-07

0.6826894921370859