计算概率分布的相关参数时,一般使用 scipy 包,常用的函数包括以下几个:

pdf:连续随机分布的概率密度函数

pmf:离散随机分布的概率密度函数

cdf:累计分布函数

百分位函数(累计分布函数的逆函数)

生存函数的逆函数(1 - cdf 的逆函数)

函数里面不仅能跟一个数据,还能跟一个数组。下面用正态分布举例说明:

>>> import scipy.stats as st

>>> st.norm.cdf(0) # 标准正态分布在 0 处的累计分布概率值

0.5

>>> st.norm.cdf([-1, 0, 1])# 标准正态分布分别在 -1, 0, 1 处的累计分布概率值

array([0.15865525, 0.5, 0.84134475])

>>> st.norm.pdf(0) # 标准正态分布在 0 处的概率密度值

0.3989422804014327

>>> st.norm.ppf(0.975)# 标准正态分布在 0.975 处的逆函数值

1.959963984540054

>>> st.norm.lsf(0.975)# 标准正态分布在 0.025 处的生存函数的逆函数值

1.959963984540054

对于非标准正态分布,通过更改参数 loc 与 scale 来改变均值与标准差:

>>> st.norm.cdf(0, loc=2, scale=1) # 均值为 2,标准差为 1 的正态分布在 0 处的累计分布概率值

0.022750131948179195

对于其他随机分布,可能更改的参数不一样,具体需要查官方文档。下面我们举一些常用分布的例子:

>>> st.binom.pmf(4, n=100, p=0.05) # 参数值 n=100, p=0.05 的二项分布在 4 处的概率密度值

0.17814264156968956

>>> st.geom.pmf(4, p=0.05) # 参数值 p=0.05 的几何分布在 4 处的概率密度值

0.04286875

>>> st.poisson.pmf(2, mu=3) # 参数值 mu=3 的泊松分布在 2 处的概率密度值

0.22404180765538775

>>> st.chi2.ppf(0.95, df=10) # 自由度为 10 的卡方分布在 0.95 处的逆函数值

18.307038053275146

>>> st.t.ppf(0.975, df=10) # 自由度为 10 的 t 分布在 0.975 处的逆函数值

2.2281388519649385

>>> st.f.ppf(0.95, dfn=2, dfd=12) # 自由度为 2, 12 的 F 分布在 0.95 处的逆函数值

3.8852938346523933

补充拓展:给定概率密度,生成随机数 python实现

实现的方法可以不止一种:

rejection sampling

invert the cdf

Metropolis Algorithm (MCMC)

本篇介绍根据累积概率分布函数的逆函数(2:invert the CDF)生成的方法。

自己的理解不一定正确,有错误望指正。

目标:

已知 y=pdf(x),现想由给定的pdf, 生成对应分布的x

PDF是概率分布函数,对其积分或者求和可以得到CDF(累积概率分布函数),PDF积分或求和的结果始终为1

步骤(具体解释后面会说):

1、根据pdf得到cdf

2、由cdf得到inverse of the cdf

3、对于给定的均匀分布[0,1),带入inverse cdf,得到的结果即是我们需要的x

求cdf逆函数的具体方法:

对于上面的第二步,可以分成两类:

1、当CDF的逆函数好求时,直接根据公式求取,

2、反之当CDF的逆函数不好求时,用数值模拟方法

自己的理解:为什么需要根据cdf的逆去获得x?

原因一:

因为cdf是单调函数因此一定存在逆函数(cdf是s型函数,而pdf则不一定,例如正态分布,不单调,对于给定的y,可能存在两个对应的x,就不可逆)

原因二:

这仅是我自己的直观理解,根据下图所示(左上为pdf,右上为cdf)

由步骤3可知,我们首先生成[0,1)的均匀随机数,此随机数作为cdf的y,去映射到cdf的x(若用cdf的逆函数表示则是由x映射到y),可以参考上图的右上,既然cdf的y是均匀随机的,那么对于cdf中同样范围的x,斜率大的部分将会有更大的机会被映射,因为对应的y范围更大(而y是随即均匀分布的),那么,cdf的斜率也就等同于pdf的值,这正好符合若x的pdf较大,那么有更大的概率出现(即重复很多次后,该x会出现的次数最多)

代码实现——方法一,公式法

import numpy as np

import math

import random

import matplotlib.pyplot as plt

import collections

count_dict = dict()

bin_count = 20

def inverseCDF():

"""

return the x value in PDF

"""

uniform_random = random.random()

return inverse_cdf(uniform_random)

def pdf(x):

return 2 * x

# cdf = x^2, 其逆函数很好求,因此直接用公式法

def inverse_cdf(x):

return math.sqrt(x)

def draw_pdf(D):

global bin_count

D = collections.OrderedDict(sorted(D.items()))

plt.bar(range(len(D)), list(D.values()), align='center')

# 因为映射bin的时候采用的floor操作,因此加上0.5

value_list = [(key + 0.5) / bin_count for key in D.keys()]

plt.xticks(range(len(D)), value_list)

plt.xlabel('x', fontsize=5)

plt.ylabel('counts', fontsize=5)

plt.title('counting bits')

plt.show()

for i in range(90000):

x = inverseCDF()

# 用bin去映射,否则不好操作

bin = math.floor(x * bin_count) # type(bin): int

count_dict[bin] = count_dict.get(bin, 0) + 1

draw_pdf(count_dict)

结果:

代码实现——方法二,数值法

数值模拟cdf的关键是创建lookup table,

table的size越大则结果越真实(即区间划分的个数)

import numpy as np

import math

import random

import matplotlib.pyplot as plt

import collections

lookup_table_size = 40

CDFlookup_table = np.zeros((lookup_table_size))

count_dict = dict()

bin_count = 20

def inverse_cdf_numerically(y):

global lookup_table_size

global CDFlookup_table

value = 0.0

for i in range(lookup_table_size):

x = i * 1.0 / (lookup_table_size - 1)

value += pdf2(x)

CDFlookup_table[i] = value

CDFlookup_table /= value # normalize the cdf

if y < CDFlookup_table[0]:

t = y / CDFlookup_table[0]

return t / lookup_table_size

index = -1

for j in range(lookup_table_size):

if CDFlookup_table[j] >= y:

index = j

break

# linear interpolation

t = (y - CDFlookup_table[index - 1]) / \

(CDFlookup_table[index] - CDFlookup_table[index - 1])

fractional_index = index + t # 因为index从0开始,所以不是 (index-1)+t

return fractional_index / lookup_table_size

def inverseCDF():

"""

return the x value in PDF

"""

uniform_random = random.random()

return inverse_cdf_numerically(uniform_random)

def pdf2(x):

return (x * x * x - 10.0 * x * x + 5.0 * x + 11.0) / (10.417)

def draw_pdf(D):

global bin_count

D = collections.OrderedDict(sorted(D.items()))

plt.bar(range(len(D)), list(D.values()), align='center')

value_list = [(key + 0.5) / bin_count for key in D.keys()]

plt.xticks(range(len(D)), value_list)

plt.xlabel('x', fontsize=5)

plt.ylabel('counts', fontsize=5)

plt.title('counting bits')

plt.show()

for i in range(90000):

x = inverseCDF()

bin = math.floor(x * bin_count) # type(bin): int

count_dict[bin] = count_dict.get(bin, 0) + 1

draw_pdf(count_dict)

真实函数与模拟结果

扩展:生成伯努利、正太分布

import numpy as np

import matplotlib.pyplot as plt

"""

reference:

https://blog.demofox.org/2017/07/25/counting-bits-the-normal-distribution/

"""

def plot_bar_x():

# this is for plotting purpose

index = np.arange(counting.shape[0])

plt.bar(index, counting)

plt.xlabel('x', fontsize=5)

plt.ylabel('counts', fontsize=5)

plt.title('counting bits')

plt.show()

# if dice_side=2, is binomial distribution

# if dice_side>2 , is multinomial distribution

dice_side = 2

# if N becomes larger, then multinomial distribution will more like normal distribution

N = 100

counting = np.zeros(((dice_side - 1) * N + 1))

for i in range(30000):

sum = 0

for j in range(N):

dice_result = np.random.randint(0, dice_side)

sum += dice_result

counting[sum] += 1

# normalization

counting /= np.sum(counting)

plot_bar_x()

以上这篇python 计算概率密度、累计分布、逆函数的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

本文标题: python 计算概率密度、累计分布、逆函数的例子

本文地址: http://www.cppcns.com/jiaoben/python/301467.html

python求概率密度函数_python 计算概率密度、累计分布、逆函数的例子相关推荐

  1. 正态分布的概率密度函数python_python 计算概率密度、累计分布、逆函数的例子...

    计算概率分布的相关参数时,一般使用 scipy 包,常用的函数包括以下几个: pdf:连续随机分布的概率密度函数 pmf:离散随机分布的概率密度函数 cdf:累计分布函数 百分位函数(累计分布函数的逆 ...

  2. python求阶乘之和_python计算阶乘前n项和

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 知道公式后就很简单了,利用for循环,第几行i+1就等于几,当然python中是 ...

  3. python求偏度系数_python模拟概率论中偏度和峰度计算

    在概率学中我们用偏度和峰度去刻画分布的情况: 偏度描述的是分布的对称性程度,如上面,右偏表示在u值的右侧分布占多数,左偏则反向,并且通过阴影的面积去刻画概率.而峰度是描述分布的最高值的情况,在常用情况 ...

  4. python概率密度函数_Python中概率密度函数的快速卷积

    您可以使用快速傅立叶变换(FFT)有效地计算所有PDF的卷积:关键事实是,FFT of the convolution是单个概率密度函数FFT的乘积.因此,转换每个PDF,将转换后的PDF相乘,然后执 ...

  5. python求素数算法_Python程序最多可计算n个质数(使用不同算法)

    python求素数算法 There are various methods through which we can calculate prime numbers upto n. 我们可以通过多种方 ...

  6. python绘制概率密度曲线_python添加概率密度曲线-女性时尚流行美容健康娱乐mv-ida网...

    自动秒收录 如何加入 (当前页) 购买本站源码 自媒体交流 查询是否收录 查询收录 × 快速加入 只要做上本站的友情链接,并在您站上点击一次,就免人工自动收录!并自动排在本站第一位. 本站已收录286 ...

  7. python方差的计算公式_python计算均值方差

    原博文 2014-06-07 14:13 − 用Python求均值与方差,可以自己写,也可以借助于numpy,不过到底哪个快一点呢? 我做了个实验,首先生成9百万个样本: ```python nlis ...

  8. python求交点坐标_Python求两个圆的交点坐标或三个圆的交点坐标方法

    计算两个圆的交点 代码如下: # -*- coding: utf-8 -*- import math import numpy as np def insec(p1,r1,p2,r2): x = p1 ...

  9. python求不规则图形面积_python 微积分之---黎曼和

    黎曼求和 这里有一块形状不规则的土地,要测量它的面积,怎么办呢?一个叫黎曼的德国数学家(Bernhard Riemann, 1826-1866),他想了个办法:将这不规则图形切成一条条的小长条儿,然后 ...

最新文章

  1. Cannot connect to the Docker daemon. Is the docker daemon running on this host?
  2. Android.mk文件编写
  3. 【MyBatis】sql列名与实体类属性名不同的解决方式
  4. 分布式与人工智能课程(part13)--模型验证
  5. Angular应用里的tsconfig.app.json
  6. python try 异常处理 史上最全
  7. C++描述杭电OJ 2009.求数列的和 ||
  8. vscode代码库登录配置_VSCode 配置 Sonar Lint支持代码检查提效
  9. 抽屉式(菜单)导航实例模板,设计师喜欢哪款?
  10. CF567E President and Roads
  11. paip.提升安全性---选择一个安全的加密算法
  12. Android Q分区存储权限变更及适配
  13. 9年经验,总结SEO职业瓶颈
  14. 工业照明节能减碳难?致远ZWS云平台有妙招
  15. 信用卡积分能兑换现金,靠谱吗?
  16. python统计套利_基于python的统计套利实战(四)之策略实现
  17. 【学习笔记】黑马程序员Java课程学习笔记(更新至第12章---集合)
  18. three points 1(平面几何 三角形)
  19. 走查是什么意思啊?如何给原稿进行走查?
  20. ICC2:平行打孔create_pg_stapling_vias

热门文章

  1. vue 取消input回车浏览器自动换行事件
  2. 发现了一个不错的开心网001的论坛
  3. 如何用ChatGPT搭建品牌文本体系?(品牌名+slogan+品牌故事)
  4. 自由软件是“绿林好汉”吗?
  5. AcWing数据结构
  6. 为什么Python编程语言应用如此广泛?
  7. 计算机缺失gfesdk.dll,xapofx1_5.dll 已加载但找不到入口点dellregisterserver
  8. 基于python的车辆轨迹研究_highD:德国提出从空中角度测量车辆数据的新方法(文末附多种车辆轨迹数据集)...
  9. 联想粒子矿云/我家云OMV(Open Media Vault) 刷Armbian后如何安装Docker,换软件源并提速?通电两三分钟就掉盘,硬改解决办法
  10. C中static的作用(精辟分析)