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

时间:2017-11-26 16:21:44

标签: python numpy probability normal-distribution probability-density

我一直在计算并绘制[-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.random.normal的随机数,范围从-1到5.但是我还没有理解如何考虑间隔从-1开始。

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

最后,我必须绘制结果。

1 个答案:

答案 0 :(得分:1)

指定N(2,1)分布是指您希望正态分布为均值2和方差(或标准差)1。在scipy术语中,mean表示位置,标准差表示比例。

要使用matplotlib制作pdf图,您可以在区间[-1,5]上选择足够的点来制作视觉上平滑的图形。这是linspace的目的。对于这些点中的每一点,您使用norm.pdf计算其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)