生成正态分布的样本

时间:2018-09-19 15:30:28

标签: python numpy statistics

需要帮助来理解这些代码行!我在这里有3个子种群:10、30和50分别正态分布,分别具有其std dev和均值,如图所示:例如:子种群10的std dev为3000,均值10,000。我要做的是对这些子种群进行随机抽样,并将结果放入我称为“样本”的列表中。问题是:我是否在示例+ = np.random.normal(mean_List [I],std_list [I],sub_pop [I])。tolist()的行中正确编码了目标?

sub_pop = [10, 30, 50]
std_list = [3000, 5000, 8000]
mean_list = [10000, 15000, 30000]
sample = []
for i in range(len(sub_pop)):
sample += np.random.normal(mean_list[i],std_list[i], sub_pop[i]).tolist()
sample1 = [abs(x) for x in sample]
print(sample1)
print(np.median(sample1))

1 个答案:

答案 0 :(得分:1)

从您的评论看来,您似乎已经知道代码已经在做什么,并且只想确保您正在使用正确的参数调用numpy方法。我认为您当前的代码中存在一个问题:您正在将所有总体合并到一个输出样本中。

为了说明这一点,我将人口总数增加到5000以作图。如果您没有在每次迭代中清除sample列表,则只需继续添加即可:

import numpy as np

import matplotlib.pyplot as plt

sub_pop = [5000, 5000, 5000]
std_list = [3000, 5000, 8000]
mean_list = [10000, 15000, 30000]
sample = []
for i in range(len(sub_pop)):
    sample += np.random.normal(mean_list[i],std_list[i], sub_pop[i]).tolist()
    sample1 = [abs(x) for x in sample]

plt.hist(sample, bins=500)
#plt.show()
plt.savefig('all_merged.png')

哪个给: enter image description here

相反,我认为您可能需要三个单独的人群。如果您不想想要单独的总体,那么至少可以澄清您是否获得了期望的输出:)

import numpy as np

import matplotlib.pyplot as plt

sub_pop = [5000, 5000, 5000]
std_list = [3000, 5000, 8000]
mean_list = [10000, 15000, 30000]
sample = []
for i in range(len(sub_pop)):
    sample += np.random.normal(mean_list[i],std_list[i], sub_pop[i]).tolist()
    sample1 = [abs(x) for x in sample]

    plt.hist(sample, bins=500)
    sample = [] # Clear the sample list
#plt.show()
plt.savefig('separated.png')

enter image description here