一起绘制伯努利样本和伯努利 pmf 的密度直方图
Plot density histogram of Bernoulli sample and a Bernoulli pmf together
问题总结:
为什么我的样本密度与 pmf 如此不同,我如何执行此模拟以使 pmf 和样本估计值相似。
问题:
我使用 scipy
模拟了独立伯努利试验的样本。我现在正在尝试获取我创建的样本的密度直方图,并将其与 pmf(概率质量函数)进行比较。我希望密度直方图显示两个箱子,每个箱子都在 pmf 附近徘徊,但相反,我有 2 个箱子高于 pmf 值 5。有人可以告诉我如何创建一个密度直方图,它不会为伯努利这样做吗?我用其他几个发行版尝试了类似的模拟,它似乎工作正常。我在这里缺少什么,你能告诉我如何操纵我的代码来完成这项工作吗?
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')
plt.show()
如果这是一个简单或微不足道的问题,我必须道歉,但我无法在网上找到解决方案,但发现这个问题很有趣。任何帮助都将不胜感激。
原因是 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()
这是默认 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()
问题总结:
为什么我的样本密度与 pmf 如此不同,我如何执行此模拟以使 pmf 和样本估计值相似。
问题:
我使用 scipy
模拟了独立伯努利试验的样本。我现在正在尝试获取我创建的样本的密度直方图,并将其与 pmf(概率质量函数)进行比较。我希望密度直方图显示两个箱子,每个箱子都在 pmf 附近徘徊,但相反,我有 2 个箱子高于 pmf 值 5。有人可以告诉我如何创建一个密度直方图,它不会为伯努利这样做吗?我用其他几个发行版尝试了类似的模拟,它似乎工作正常。我在这里缺少什么,你能告诉我如何操纵我的代码来完成这项工作吗?
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')
plt.show()
如果这是一个简单或微不足道的问题,我必须道歉,但我无法在网上找到解决方案,但发现这个问题很有趣。任何帮助都将不胜感激。
原因是 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()
这是默认 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()