需要帮助来了解这一行代码

时间:2018-09-20 03:30:59

标签: python numpy statistics

我正在从以下正态分布的子群体中进行300次重复随机抽样,样本大小为50(14 + 20 + 16):

sub_pop = [14, 20, 16]
mean_list = [100, 200, 300]
std_list = [40, 70, 80]

我的目标是通过300次重复随机采样来可视化该样本的样本中值的采样分布。

这就是我所做的:

groups = [{'label': 'sub_one', 'mean': 100, 'std_dev': 40, 'size': 14}, 
          {'label': 'sub_two', 'mean': 200, 'std_dev': 70, 'size': 20},
          {'label': 'sub_three', 'mean': 300, 'std_dev': 80, 'size': 16}]

def median(mean, std_dev):
    data = np.random.normal(mean, std_dev) # indented function
    get_median = np.median(data)
    return get_median

group_all = []

for i in range(300):
    for i in range(groups[0]['size']):
        group_all.append(median(groups[0]['mean'], groups[0]['std_dev']))

for i in range(groups[1]['size']):
    group_all.append(median(groups[1]['mean'], groups[1]['std_dev']))

for i in range(groups[2]['size']):
    group_all.append(median(groups[2]['mean'], groups[2]['std_dev']))

sample = [abs(x) for x in group_all]
sns.distplot(sample, color = 'blue')
plt.show()

我的疑问是...我不太了解前4行代码。 python是否认识到我想从3个正态分布的子总体中随机抽取300个样本,并且每个子群体均以各自的均值和标准差正态分布? 非常感谢!

1 个答案:

答案 0 :(得分:2)

函数本身和您的组创建都是正确的,但是存在一些小错误,还有一些可以做得更好的事情。

您可以按照自己的方式做,并在组大小上迭代中值函数。但是np.random.normal函数可以采用第三个参数。因此该功能可以重写

def median(mean, std_dev, size):
    data = np.random.normal(mean, std_dev, size)
    get_median = np.median(data)
return get_median

循环有点问题。您重复进行300次,等于进行300次所需的模拟,但是随后每个人都被添加到group_all中。不是我想您想要的每个人口的中位数。上面的函数中使用size参数对此进行了修复。

然后有两个具有相同变量名的嵌套循环。在这种情况下,它确实可以工作,但是这是不好的做法。不使用第一个for循环变量,因此最好将其称为_。另外,其他两个循环也位于第一个for循环之外,不会被迭代。循环可以更改为

groups_data = [[] for _ in range(3)]
for _ in range(300):
    for i, group in enumerate(groups):
        groups_data[i].append(median(group['mean'], group['std_dev'], group['size']))

您还可以在同一图中绘制多个组。只需将它们堆叠在plt.show()调用之前即可。

for group in groups_data:
    sns.distplot(group)
plt.show()

我认为这段代码更加简洁,希望更接近于您想要实现的目标。祝你好运!