提问者:小点点

如何使用scipy.stats.norm.CDF和matplotlib获得sigmodal CDF曲线?


我试图绘制一个正态分布的S形累积分布函数(cdf)曲线。 然而,我最终得到了一个均匀的分布。 我做错了什么?

测试脚本

import numpy as np
from numpy.random import default_rng
from scipy.stats import norm
import matplotlib.pyplot as plt

siz = 1000
rg = default_rng( 12345 )
a = rg.random(size=siz)
rg = default_rng( 12345 )
b = norm.rvs(size=siz, random_state=rg)
c = norm.cdf(b)

print( 'a = ', a)
print( 'b = ', b)
print( 'c = ', c)

fig, ax = plt.subplots(3, 1)
acount, abins, aignored = ax[0].hist( a, bins=20, histtype='bar', label='a', color='C0' )
bcount, bbins, bignored = ax[1].hist( b, bins=20, histtype='bar', label='b', color='C1' )
ccount, cbins, cignored = ax[2].hist( c, bins=20, histtype='bar', label='c', color='C2' )
print( 'acount, abins, aignored = ', acount, abins, aignored)
print( 'bcount, bbins, bignored = ', bcount, bbins, bignored)
print( 'ccount, cbins, cignored = ', ccount, cbins, cignored)
ax[0].legend()
ax[1].legend()
ax[2].legend()
plt.show()


共2个答案

匿名用户

我不知道你的具体申请。 但我认为问题在于,你正在为一些正态分布的随机数创建cdf的值。 下面您可以看到一个代码示例,它绘制了从-3到+3的标准法线的CDF

import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt

x = np.arange(-3, 3, 0.1)
c = norm.cdf(x)

plt.plot(x, c)
plt.show()

标准正态CDF

匿名用户

你在策划错误的价值观。 当您执行b=norm.rvs(size=siz,random_state=rg)时,您得到的是从标准正态分布中独立抽取的10个随机样本,即z

因此,它们的直方图就是你所看到的钟形曲线。

norm.cdf返回给定z值的CFD值。 如果你想要cdf的S曲线,你可以从-3到3个z值统一绘制,得到它们在所有点的cdf值。 然后绘制输出概率值。

编辑:另一个答案给出了这种方法的代码,所以我就不麻烦再添加了。