如何利用旧均值、旧列表长度与新列表计算合并后正确均值?
如何基于已有均值、旧数据集长度和新数据集计算合并后的正确均值
问题背景
我们已经计算并保存了旧数据集l1的均值m1,但未保留l1的具体内容,仅知道l1的长度n1。现在拿到新数据集l2,需要计算l1与l2合并后的正确均值——注意直接对m1和l2的均值m2取平均是错误的,因为两个数据集长度不同,直接平均会产生偏差。
示例验证
先看两种计算方式的差异:
旧数据集相关代码:
from statistics import mean l1 = [1,0,1,0,0,0,0,1,1,1,0,1] m1 = mean(l1) n1 = len(l1) print(m1) # 输出:0.5
新数据集相关代码:
l2 = [1,0,1,1,1,1,1,1,1,0,0,0,1,0,0,0,0,1,1,1,0,1] m2 = mean(l2) n2 = len(l2) print(m2) # 输出:0.5909090909090909
直接平均两个均值的错误结果:
m3_wrong = mean([m1, m2]) print(m3_wrong) # 输出:0.5454545454545454
合并数据集计算的正确均值:
m3_correct = mean(l1 + l2) print(m3_correct) # 输出:0.5588235294117647
可见两种方式结果差异明显,直接平均两个均值的方法不成立。
解决方案
核心思路是通过总加权和计算均值:
合并后的总数值和 = 旧数据集总和 + 新数据集总和
其中,旧数据集总和 = 旧均值m1 × 旧数据集长度n1,新数据集总和可通过sum(l2)直接计算,或用新均值m2 × 新数据集长度n2推导。
最终合并均值的公式为:
m3 = (m1 * n1 + sum(l2)) / (n1 + n2)
若已算出m2,也可使用:
m3 = (m1 * n1 + m2 * n2) / (n1 + n2)
代码实现
from statistics import mean # 已知的旧数据信息 m1 = 0.5 n1 = 12 # 新数据集 l2 = [1,0,1,1,1,1,1,1,1,0,0,0,1,0,0,0,0,1,1,1,0,1] n2 = len(l2) sum_l2 = sum(l2) # 计算正确的合并均值 m3 = (m1 * n1 + sum_l2) / (n1 + n2) print(m3) # 输出:0.5588235294117647,与合并数据集计算结果一致
或用m2推导的方式:
m2 = mean(l2) m3 = (m1 * n1 + m2 * n2) / (n1 + n2) print(m3) # 同样输出正确结果
内容的提问来源于stack exchange,提问作者Johnson Francis
相关产品推荐
相关产品推荐

