首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >聚合标准差

聚合标准差
EN

Data Science用户
提问于 2018-07-24 09:27:59
回答 2查看 894关注 0票数 1

想象一下,我收集了一组数据,比方说,一个路段的旅行时间。在这个集合上,我想计算平均值和标准差。到目前为止没什么难的。

现在想象一下,我没有为一个路段收集值,而是有多个值集合,这些值对应于组成路段的多个子段。

对于每个集合,我知道平均值和标准差。由此,我想把这些多重平均偏差和标准差相加,从而得到整个路段的平均偏差和标准差。

例如,假设我有以下数据集:

代码语言:javascript
复制
           subSegmentA , subSegmentB , subSegmentC , subSegmentD
values              20            45            25            70
                    30            55            10            60
                    10            10            10            80
                    15            50            30            75
                    15            40            15            75
                    20            40            20            80
                    30            45            20            65
                    10            40            25            70

average          18.75        40.625        19.375        71.875
stddev      7.90569415   13.47948176   7.288689869   7.039429766

expected_global_average : 150.625
expected_global_stddev  : 18.40758772

对于平均来说没有问题,一个简单的和做的工作,但我有麻烦的global_stddev。

我尝试了这里的多种解决方案,但都没有成功。

编辑:经过进一步的研究,似乎不可能仅仅根据子集的标准差和平均值来计算集合的标准差。

因此,我试图计算一个新的度量,它将近似于这个全球标准差。

要做到这一点,除了每个子段的avg/stddev之外,我还可以使用子段与道路的长度比。

EN

回答 2

Data Science用户

回答已采纳

发布于 2018-07-24 23:43:56

它并不完美,但您可以尝试重新创建基于平均值和sd的合成数据。在R中,可以使用rnorm函数从meansd创建正态分布。以下是其中一种方法。希望能帮上忙!我选择n= 1000来说明它是如何实现的,你可以尝试使用不同的数字。

代码语言:javascript
复制
a <- c(20,30,10,15,15,20,30,10)
b <- c(45,55,10,50,40,40,45,40)
c <- c(25,10,10,30,15,20,20,25)
d <- c(70,60,80,75,80,60,65,70)

n <- 1000

e <- c(rnorm(n, mean(a), sd(a)) +
   rnorm(n, mean(b), sd(b)) +
   rnorm(n, mean(c), sd(c)) +
   rnorm(n, mean(d), sd(d)))

mean(e)
sd(e)

在网上试试

票数 0
EN

Data Science用户

发布于 2022-11-20 07:48:55

您可以使用Chan等人的“批处理扩展”。将方差(标准差平方)和数据子集均值结合起来的Welford算法。该算法在数值上具有鲁棒性和精确性。

https://en.wikipedia.org/wiki/Algorithms_为_计算_variance#Parallel_算法

我在这里用Python实现了它:https://github.com/himbeles/pairwise-statistics

对于您的例子,用法和结果将是

代码语言:javascript
复制
# biased or unbiased estimator
ddof=0

# combine statistics of array a, b, c, d
array_a = np.array([20,30,10,15,15,20,30,10])
array_b = np.array([45,55,10,50,40,40,45,40])
array_c = np.array([25,10,10,30,15,20,20,25])
array_d = np.array([70,60,80,75,75,80,65,70])
n_a = len(array_a)
n_b = len(array_b)
n_c = len(array_c)
n_d = len(array_d)
mean_a = np.mean(array_a)
mean_b = np.mean(array_b)
mean_c = np.mean(array_c)
mean_d = np.mean(array_d)
var_a = np.var(array_a, ddof=ddof)
var_b = np.var(array_b, ddof=ddof)
var_c = np.var(array_c, ddof=ddof)
var_d = np.var(array_d, ddof=ddof)

sa = StatisticsAggregator(ddof=ddof)
sa.add(n_a, mean_a, var_a)
sa.add(n_b, mean_b, var_b)
sa.add(n_c, mean_c, var_c)
sa.add(n_d, mean_d, var_d)

print('global mean', sa.mean)
print('global std. dev.', np.sqrt(sa.var))

#>> global mean 37.65625
#>> global std. dev. 23.317924134397128

# result should be variance and mean of concatenated, total array
array_e = np.hstack([array_a, array_b, array_c, array_d])
n_e = len(array_e)
mean_e = np.mean(array_e)
var_e = np.var(array_e, ddof=ddof)
assert np.isclose(sa.mean, mean_e) 
assert np.isclose(sa.var, var_e) 
票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/35953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档