代码之家  ›  专栏  ›  技术社区  ›  AlexT

计算并绘制[-1,5]区间内的理论正态分布N(2,1)

  •  1
  • AlexT  · 技术社区  · 8 年前

    我一直在做一个任务,计算并绘制[-1,5]区间内的正态分布N(2,1)

    以下是我尝试过的:

    vec = np.random.norm(2, 1, 7);
    ND = stats.norm(2, 1).pdf(vec)
    x = np.arange(1, 6, 1)
    plt.figure()
    plt.plot(x, 'r')
    plt.hist(ND)
    plt.show()
    

    正如你可能已经发现的那样,这并没有给我我想要的结果。

    我一辈子都想不出来。请注意,我是一名学生,最近才开始用Python编写代码。

    我被要求用np生成随机数。随机的正常范围为-1到5。然而,考虑到时间间隔从-1开始,我还没有理解如何做到这一点。

    其次,我被要求使用函数范数。来自scipy的pdf。但是我不理解这个函数的文档( https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.norm.html )

    最后,我必须绘制结果。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Bill Bell    8 年前

    指定一个N(2,1)分布就是说你想要一个均值为2、方差(或标准差)为1的正态分布。在scipy术语中,平均值等于位置,标准差等于刻度。

    要使用matplotlib绘制pdf,您需要在间隔[-1,5]上选择足够的点,以生成视觉平滑的图形。这就是 linspace . 对于这些点中的每一个点,使用 norm.pdf .

    from scipy.stats import norm
    from matplotlib import pyplot as plt
    import numpy as np
    
    x = np.linspace(-1, 5, 100, endpoint=True)
    pdf = [norm.pdf(_, loc=2, scale=1) for _ in x]
    
    plt.plot(x, pdf, 'b-')
    plt.show()
    

    在这里,我创建了一个大小为10的示例。我知道 norm.rvs 将在整个实线上产生偏差;因此,为了获得期望区间的偏差,我只需忽略该区间之外的偏差。每次调用“norm”。“rvs”生成一个长度为1的numpy“数组”。为了获得一个好的结果,我只选择该数组中的第一个项,并将其附加到整个样本中(如果在所需的间隔内)。

    sample_size = 10
    sample = []
    while len(sample)<sample_size:
        while True:
            deviate = norm.rvs(loc=2, scale=1, size=1)[0]
            if -1<=deviate<=5:
                break
        sample.append(deviate)
    print (sample)