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

一起绘制伯努利样本和伯努利 pmf 的密度直方图

一起绘制伯努利样本和伯努利 pmf 的密度直方图

缥缈止盈 2023-06-27 14:45:55
问题摘要:为什么我的样本密度与 pmf 如此不同,如何执行此模拟以使 pmf 和样本估计值相似。问题:我使用 模拟了独立伯努利试验的样本scipy。我现在尝试获取我创建的样本的密度直方图,并将其与 pmf(概率质量函数)进行比较。我希望密度直方图显示两个箱,每个箱悬停在 pmf 附近,但相反,我有 2 个箱高于 pmf 值 5。有人可以告诉我如何创建一个不为伯努利执行此操作的密度直方图吗?我尝试了一些其他发行版的类似模拟,它似乎工作得很好。我在这里缺少什么,你能告诉我如何操作我的代码来完成这项工作吗?import numpy as npimport matplotlib.pyplot as pltimport scipy.stats as statstrials = 10**3p = 0.5sample_bernoulli = stats.bernoulli.rvs(p, size=trials) # Generate benoulli RVplt.plot((0,1), stats.bernoulli.pmf((0,1), p), 'bo', ms=8, label='bernoulli pmf')# Density histogram of generated valuesplt.hist(sample_bernoulli, density=True, alpha=0.5, color='steelblue', edgecolor='none')plt.show()如果这是一个简单或微不足道的问题,我必须道歉,但我无法在网上找到解决方案并发现这个问题很有趣。任何帮助将不胜感激。
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

原因是这plt.hist主要是为了处理连续分布。如果您不提供明确的 bin 边界,plt.hist则只需在最小值和最大值之间创建 10 个等距的 bin。这些垃圾箱大部分都是空的。如果只有两个可能的数据值,则应该只有两个 bin,因此有 3 个边界:


import numpy as np

import matplotlib.pyplot as plt

import scipy.stats as stats


trials = 10**3

p = 0.5


sample_bernoulli = stats.bernoulli.rvs(p, size=trials) # Generate benoulli RV

plt.plot((0,1), stats.bernoulli.pmf((0,1), p), 'bo', ms=8, label='bernoulli pmf')


# Density histogram of generated values

plt.hist(sample_bernoulli, density=True, alpha=0.5, color='steelblue', edgecolor='none', bins=np.linspace(-0.5, 1.5, 3))

plt.show()

//img1.sycdn.imooc.com//649a861100010f8706230390.jpg

以下是默认 bin 边界以及样本如何放入 bin 的可视化。请注意density=True,使用 时,直方图已标准化,所有条形的面积之和为 1。在本例中,两个条形宽且0.1高5.0,而其他 8 个条形的高度为零。所以,总面积为2*0.1*5 + 8*0.0 = 1。


import numpy as np

import matplotlib.pyplot as plt

import scipy.stats as stats


trials = 10 ** 3

p = 0.5


sample_bernoulli = stats.bernoulli.rvs(p, size=trials)  # Generate benoulli RV


# Density histogram of generated values with default bins

values, binbounds, bars = plt.hist(sample_bernoulli, density=True, alpha=0.2, color='steelblue', edgecolor='none')

# show the bin boundaries

plt.vlines(binbounds, 0, max(values) * 1.05, color='crimson', ls=':')

# show the sample values with a random displacement

plt.scatter(sample_bernoulli * 0.9 + np.random.uniform(0, 0.1, trials),

            np.random.uniform(0, max(values), trials), color='lime')

# show the index of each bin

for i in range(len(binbounds) - 1):

    plt.text((binbounds[i] + binbounds[i + 1]) / 2, max(values) / 2, i, ha='center', va='center', fontsize=20, color='crimson')

plt.show()

//img1.sycdn.imooc.com//649a86240001ecdc08850256.jpg

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

添加回答

举报

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