电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

python 計算概率密度、累計分布、逆函數的例子

瀏覽:4日期:2022-08-06 14:20:17

計算概率分布的相關參數時,一般使用 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)

python 計算概率密度、累計分布、逆函數的例子

由步驟3可知,我們首先生成[0,1)的均勻隨機數,此隨機數作為cdf的y,去映射到cdf的x(若用cdf的逆函數表示則是由x映射到y),可以參考上圖的右上,既然cdf的y是均勻隨機的,那么對于cdf中同樣范圍的x,斜率大的部分將會有更大的機會被映射,因為對應的y范圍更大(而y是隨即均勻分布的),那么,cdf的斜率也就等同于pdf的值,這正好符合若x的pdf較大,那么有更大的概率出現(即重復很多次后,該x會出現的次數最多)

代碼實現——方法一,公式法

import numpy as npimport mathimport randomimport matplotlib.pyplot as pltimport collectionscount_dict = dict()bin_count = 20def 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) + 1draw_pdf(count_dict)

結果:

python 計算概率密度、累計分布、逆函數的例子

代碼實現——方法二,數值法

數值模擬cdf的關鍵是創建lookup table,

table的size越大則結果越真實(即區間劃分的個數)

import numpy as npimport mathimport randomimport matplotlib.pyplot as pltimport collectionslookup_table_size = 40CDFlookup_table = np.zeros((lookup_table_size))count_dict = dict()bin_count = 20def 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_sizedef 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) + 1draw_pdf(count_dict)

真實函數與模擬結果

python 計算概率密度、累計分布、逆函數的例子

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

import numpy as npimport 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 distributiondice_side = 2# if N becomes larger, then multinomial distribution will more like normal distributionN = 100counting = 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# normalizationcounting /= np.sum(counting)plot_bar_x()

以上這篇python 計算概率密度、累計分布、逆函數的例子就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 生物制药洁净车间-GMP车间净化工程-食品净化厂房-杭州波涛净化设备工程有限公司 | BESWICK球阀,BESWICK接头,BURKERT膜片阀,美国SEL继电器-东莞市广联自动化科技有限公司 | 【ph计】|在线ph计|工业ph计|ph计厂家|ph计价格|酸度计生产厂家_武汉吉尔德科技有限公司 | 七维官网-水性工业漆_轨道交通涂料_钢结构漆 | 福州甲醛检测-福建室内空气检测_环境检测_水质检测-福建中凯检测技术有限公司 | 存包柜厂家_电子存包柜_超市存包柜_超市电子存包柜_自动存包柜-洛阳中星 | PO膜_灌浆膜及地膜供应厂家 - 青州市鲁谊塑料厂 | 英国公司注册-新加坡公司注册-香港公司开户-离岸公司账户-杭州商标注册-杭州优创企业 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 超声波清洗机-超声波清洗设备定制生产厂家 - 深圳市冠博科技实业有限公司 | 电线电缆厂家|沈阳电缆厂|电线厂|沈阳英联塑力线缆有限公司 | 铝机箱_铝外壳加工_铝外壳厂家_CNC散热器加工-惠州市铂源五金制品有限公司 | 水环真空泵厂家,2bv真空泵,2be真空泵-淄博真空设备厂 | 汕头市盛大文化传播有限公司,www.11400.cc | 铣床|万能铣床|立式铣床|数控铣床|山东滕州万友机床有限公司 | China plate rolling machine manufacturer,cone rolling machine-Saint Fighter | 高速龙门架厂家_监控杆_多功能灯杆_信号灯杆_锂电池太阳能路灯-鑫世源照明 | TwistDx恒温扩增-RAA等温-Jackson抗体-默瑞(上海)生物科技有限公司 | 硫酸亚铁-聚合硫酸铁-除氟除磷剂-复合碳源-污水处理药剂厂家—长隆科技 | 中原网视台| 四合院设计_四合院装修_四合院会所设计-四合院古建设计与建造中心1 | China plate rolling machine manufacturer,cone rolling machine-Saint Fighter | 西安耀程造价培训机构_工程预算实训_广联达实作实操培训 | 锂电叉车,电动叉车_厂家-山东博峻智能科技有限公司 | 塑料检查井_双扣聚氯乙烯增强管_双壁波纹管-河南中盈塑料制品有限公司 | 泰国专线_泰国物流专线_广州到泰国物流公司-泰廊曼国际 | 气力输送设备_料封泵_仓泵_散装机_气化板_压力释放阀-河南锐驰机械设备有限公司 | 电加热导热油炉-空气加热器-导热油加热器-翅片电加热管-科安达机械 | 卓能JOINTLEAN端子连接器厂家-专业提供PCB接线端子|轨道式端子|重载连接器|欧式连接器等电气连接产品和服务 | 密集架-手摇-智能-移动-价格_内蒙古档案密集架生产厂家 | 东莞爱加真空科技有限公司-进口真空镀膜机|真空镀膜设备|Polycold维修厂家 | 压砖机、液压制砖机、静压砖机、环保砖机生产厂家—杜甫机械 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | 煤矿支护网片_矿用勾花菱形网_缝管式_管缝式锚杆-邯郸市永年区志涛工矿配件有限公司 | 3d打印服务,3d打印汽车,三维扫描,硅胶复模,手板,快速模具,深圳市精速三维打印科技有限公司 | 附着力促进剂-尼龙处理剂-PP处理剂-金属附着力处理剂-东莞市炅盛塑胶科技有限公司 | 云阳人才网_云阳招聘网_云阳人才市场_云阳人事人才网_云阳人家招聘网_云阳最新招聘信息 | 对照品_中药对照品_标准品_对照药材_「格利普」高纯中药标准品厂家-成都格利普生物科技有限公司 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库 | 全自动贴标机-套标机-工业热风机-不干胶贴标机-上海厚冉机械 | 德国进口电锅炉_商用电热水器_壁挂炉_电采暖器_电热锅炉[德国宝] | 无痕胶_可移胶_无痕双面胶带_可移无痕胶厂家-东莞凯峰 |