为了账号安全,请及时绑定邮箱和手机立即绑定

如何用 Python 创建指数概率论文

如何用 Python 创建指数概率论文

四季花海 2023-09-12 10:38:50
我现在正在尝试用python重新创建这个指数概率论文的图表。为了做到这一点,我必须将 CDF 函数线性化为:x = a*g(Fx(x)) + b然后绘制xvs g(Fx(x))。该图显示了不同分布的参数但是我不知道如何继续。显然 x 轴的比例必须改变。我已经尝试过使用 probplot,但结果完全相同。有任何想法吗?import matplotlib.pyplot as pltimport numpy as npfrom scipy.stats import exponfrom scipy.stats import probplot# Creating plotfig,ax =plt.subplots()newax=ax.twiny()ax.grid()# Lognormallambda_expon=0.04i=1/lambda_exponprobs=np.arange(0.01,0.99,0.01) # array with probabilitiesppf =expon.ppf(probs,i) cdf=expon.cdf(ppf,i) x=-np.log(1-cdf) # variabley=-np.log(1-cdf)*i # linearized form CDFax.plot(x,y)newax.set_xticks([0.01,0.5,0.8,0.9,0.96,0.99])newax.set_xticks([0.01,0.5,0.90,0.99])ax.plot()
查看完整描述

1 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

不确定,为什么你认为这是 CDF 图。如果在 X 轴上放置概率,在 Y 轴上绘制x,它看起来像分位数图。


我没有在 Python/Matplotlib 中看到内置的此类比例,logit看起来像是最佳近似值。


或者我误解了你的问题?


代码,Python 3.8 x64 Win10


import numpy as np

import matplotlib.pyplot as plt


# exponential distribution

def PDF(x, λ):

    return λ*np.exp(-λ*x)


def CDF(x, λ):

    return 1.0 - np.exp(-λ*x)


def Q(p, λ): # quantile

    x = -np.log(1.0 - p)/λ

    return x


# plots

λ = 0.04


p = np.linspace(0.01, 0.99, 101)

x = Q(p, λ)


fig = plt.figure()

ax  = fig.add_subplot(2, 1, 1)


ax.set_xscale('logit')

ax.plot(p, x, 'r-')


plt.show()

你会得到类似的东西

https://img1.sycdn.imooc.com//64ffcf6d0001c25f06010209.jpg

更新


如果您需要概率图,这里是


代码


from scipy.stats import expon


rve = expon(loc=0.0, scale=1.0/λ)


p = np.linspace(0.01, 0.99, 101)

x = rve.ppf(p) #  Q(p, λ)


q = rve.rvs(size = 10000)


fig = plt.figure()

ax  = fig.add_subplot(2, 1, 1)

   

res = stats.probplot(q, dist=rve, plot=ax)


plt.show()

和图表

https://img1.sycdn.imooc.com//64ffcf7b0001581e06230245.jpg

好吧,当你发送消息时我已经写好了代码。无论如何将其放置在这里,它看起来与您询问的图表完全相同 - 与自定义标签呈线性。


import matplotlib.ticker as ticker


def linear(x0, xn, y0, yn, x):

    q = (x-x0)/(xn-x0)

    return q * yn + (1.0 - q) * y0


pmin = 0.009

pmax = 0.991


xmin = Q(pmin, λ)

xmax = Q(pmax, λ)


x = np.linspace(xmin, xmax, 2)

p = np.linspace(pmin, pmax, 2)


tick_values = [0.01, 0.50, 0.80, 0.90, 0.96, 0.99] # probabilies

tick_names  = [str(v) for v in tick_values] # ticks to place on graph


tick_xvals  = [Q(p, λ) for p in tick_values] # x values for each p

tick_places = [linear(xmin, xmax, pmin, pmax, x) for x in tick_xvals] # x from linear function


fig = plt.figure()

ax  = fig.add_subplot(2, 1, 1)


ax.axes.xaxis.set_major_locator(ticker.FixedLocator((tick_places)))

ax.xaxis.set_major_formatter(ticker.FixedFormatter((tick_names)))


ax.plot(p, x, 'r-')


plt.show()

和图表本身

https://img1.sycdn.imooc.com//64ffcf8700013ffc05910205.jpg

查看完整回答
反对 回复 2023-09-12
  • 1 回答
  • 0 关注
  • 44 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信