生成具有精确平均值和标准差的样本数据

问题描述 投票:0回答:4

我想创建一个具有特定平均值和标准偏差的数据集。

使用 np.random.normal() 给我一个近似值。然而,对于我想要测试的内容,我需要精确的平均值和标准偏差。

我尝试过使用norm.pdf和np.linspace的组合,但是生成的数据集也不匹配(但这可能只是我误用了它)。

只要我可以设置特定的样本大小、平均值和标准偏差,数据集是否随机并不重要。

非常感谢您的帮助

python statistics dataset
4个回答
14
投票

最简单的方法是生成一些具有所需标准差的零均值样本。然后从样本中减去样本均值,使其真正为零均值。然后缩放样本以使标准差准确,然后添加所需的平均值。

这是一些示例代码:

import numpy as np

num_samples = 1000
desired_mean = 50.0
desired_std_dev = 10.0

samples = np.random.normal(loc=0.0, scale=desired_std_dev, size=num_samples)

actual_mean = np.mean(samples)
actual_std = np.std(samples)
print("Initial samples stats   : mean = {:.4f} stdv = {:.4f}".format(actual_mean, actual_std))

zero_mean_samples = samples - (actual_mean)

zero_mean_mean = np.mean(zero_mean_samples)
zero_mean_std = np.std(zero_mean_samples)
print("True zero samples stats : mean = {:.4f} stdv = {:.4f}".format(zero_mean_mean, zero_mean_std))

scaled_samples = zero_mean_samples * (desired_std_dev/zero_mean_std)
scaled_mean = np.mean(scaled_samples)
scaled_std = np.std(scaled_samples)
print("Scaled samples stats    : mean = {:.4f} stdv = {:.4f}".format(scaled_mean, scaled_std))

final_samples = scaled_samples + desired_mean
final_mean = np.mean(final_samples)
final_std = np.std(final_samples)
print("Final samples stats     : mean = {:.4f} stdv = {:.4f}".format(final_mean, final_std))

产生与此类似的输出:

Initial samples stats   : mean = 0.2946 stdv = 10.1609
True zero samples stats : mean = 0.0000 stdv = 10.1609
Scaled samples stats    : mean = 0.0000 stdv = 10.0000
Final samples stats     : mean = 50.0000 stdv = 10.0000

6
投票

对于稍后看到这一点的其他人,Python 3.8+ 有 statistics.NormalDist 类正是用于此目的:

import statistics as s
n = s.NormalDist(mu=10, sigma=2)
samples = n.samples(100_000, seed=42)  # remove seed if desired
print(s.mean(samples))  # 10.004521585462394
print(s.stdev(samples))  # 2.0052615406360457

如果需要,@Spoonless 答案中的方法可用于调整样本的精确均值和标准差,或者可以使用足够多的样本来获得非常接近的结果 - 毕竟这是统计数据。


0
投票

您也可以使用随机库来执行此操作。

import random as rand
mean = 20.9
stdd = 3
samples = 1000
data = [rand.normalvariate(mean, stdd) for i in range(samples)]

我还需要生成带有残差的数据,所以我简单地将

rand.randomrange(-1,1)
与残差的乘积相加。

data = [rand.normalvariate(mean, stdd)+(rand.randrange(-1,1)*residual) for i in range(samples)]

请注意,通过添加残差,您将稍微偏离精确均值和标准差。


0
投票

有没有什么软件可以从20个数据点的平均值和标准差推断出缺失的5个数据点? 给定:平均值/标准差/15个原始数据点(整数或2位小数,共20个数据点)。 求解:推断剩余 5 个未知数据点。 要求: 1.) 推断后平均值/标准差保持不变; 2.) 您可以指定小数位数进行推理。

目前完全是手动完成,先调整平均值,然后根据标准差调整5个数据点内的最大值和最小值,效率很低。

© www.soinside.com 2019 - 2024. All rights reserved.