【问题标题】:Plotting random numbers from a given distribution along with their expected value in Python在 Python 中绘制来自给定分布的随机数及其期望值
【发布时间】:2020-03-09 01:06:53
【问题描述】:

我想将从某些分布中随机生成的采样值与这些分布的实际函数进行比较。

我目前使用matplotlib 进行绘图,numpy 进行采样。

我找到了一个我想要实现的工作示例

# read mu, sigma, n
x = np.random.normal(mu, sigma, n)
count, bins, ignored = plt.hist(x, bins="auto", density=True)
plt.plot(bins, 1 / (sigma * np.sqrt(2 * np.pi)) * np.exp(-(bins - mu) ** 2 / (2 * sigma ** 2)), linewidth=2, color='r')
plt.show()

所以x 是样本数组,他们使用直方图绘制它,并为函数使用实际的 pdf。

例如,这对二项分布有何作用? 我遵循了类似的模式:

x = np.random.binomial(N, P, n)
count, bins, ignored = plt.hist(x, bins="auto", density=True)
plt.plot(bins, scipy.special.comb(N, bins) * (P ** bins) * ((1 - P) ** (N - bins)), linewidth=2, color='r')
plt.show()

但是我得到的图表看起来并不正确:

好吧,pdf 的高度似乎与直方图不匹配。我究竟做错了什么?是二项式函数吗?

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    我认为你说得对。您的 pdf 公式看起来是正确的。尝试使用来自二项式的大量样本 (n)。回想一下 pdf 下的区域集成到 1.0。通过使用density=True,您的直方图也被标准化,这很好。当您没有足够大的n 时会发生什么?你有空的垃圾箱......而其他垃圾箱相对较高。

    我针对 N=1000、P=0.7、n=10,000 运行了您的代码,得到了不错的情节。为此,E[X] = 700。情节看起来很合理......

    【讨论】:

      【解决方案2】:

      bins = "auto" 默认为sturges 方法,它只考虑数据大小。它只适用于高斯数据,并低估了大型非高斯数据集的 bin 数量。

      【讨论】:

        【解决方案3】:

        我不完全确定您为什么要尝试根据 hist 函数的返回参数来估计 PDF,但是可以仅使用 scipy 的 binom.pmf 来绘制它(概率质量函数,离散等效于PDF):

        N, P = 100, 0.5
        f, ax1 = plt.subplots(figsize=(10, 5))
        x = np.random.binomial(N, P, 50000)
        count, bins, ignored = ax1.hist(x, bins="auto")
        ax2 = ax1.twinx()
        ax2.plot(range(100), binom.pmf(range(100), n=N, p=P))
        ax2.grid(None)
        plt.show()
        

        输出:

        (我在第二个 ax 中隐藏了网格,因为两个 y 轴没有完全对齐,基于 this。)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-06
          相关资源
          最近更新 更多