警惕大数据处理中的“检查者悖论”

天翼云开发者社区
• 阅读 2

本文分享自天翼云开发者社区《警惕大数据处理中的“检查者悖论》.作者:王****淋

什么是检查者悖论:

*观察的角度不同,得出的统计结论也不同。有时又称为"候车悖论", "等待时间悖论" * 为了形象说明,我们设计了一种模拟场景: 班级人数统计,来用实例说明这个问题

模拟场景: 班级人数统计

小明与小华要完成一个任务:统计学校中的 平均班级人数。但二人的实施方案不同: 1)小明找到了教务处老师,拿到了一份每班级人数统计名单。 于是他计算到了班级平均人数

警惕大数据处理中的“检查者悖论”

, 其中N为班级数量。 2)小华则不同, 他选择去街头询问。小华在校园中随机询问了M人, 得到了M个数字, 每个数字即为该被询问的同学所在的班级人数。于是他计算到了班级平均人数

警惕大数据处理中的“检查者悖论”

显然,二者的答案是不同的: 假设此学校一共2个班级: 一个90人,另一个10人。则小明计算结果: C^{mean} = (10 + 90) / 2 = 50人。 假设小华抽了10人,在随机抽样的情况下,大约9人属于班级1,1人属于班级2,小华计算结果 X^{mean} = (101 + 909) / 10 = 82人

原因初探

很明显, 结果出现了偏差。是什么导致了这种情况?其实,这就是"检查悖论"每个班级人数不均衡情况下:

警惕大数据处理中的“检查者悖论”

新问题提出 ================

这时,自然的,我们提出一个问题:如果只有小华的数据,如何得到真实的统计结果,即班级平均人数 ? EM算法可以胜任这一问题:EM是一类算法, 在包含隐变量的情况下,可以估算模型参数。 下面以班级平均人数统计问题为例:

警惕大数据处理中的“检查者悖论”

其中,Si是已知量,ki为参数,sigma为隐变量,ni是观测变量。

上代码:

import random

def print_dict(d:dict, title=""):
    k = [ki for ki in d.keys()]
    k.sort()
    s = []
    for ki in k:
        s.append(str(ki) + ": " + str(d[ki]))
    print(title, "{", "; ".join(s), "}")


### 1. 数据集生成:通过随机数================================================
#     1.1. 首先生成每班人数
classes = 20
classes = classes // 2 * 2
class_members = [random.randint(40, 50) for i in  range(classes//2)] + \
                [random.randint(100, 150) for i in  range(classes//2)]  \

class_dict = {}     # 统计量: 人数为Ni的班级>共有多少个
for ci in class_members:
    if ci in class_dict.keys(): class_dict[ci] += 1
    else:class_dict[ci] = 1

#    1.2. 在街上抽学生(依据每班人数)
cy = random.choices(
    population=class_members,
    weights=[ci/sum(class_members) for ci in class_members],  # 依概率抽样
    k = 400                 # 街头抽样人数:应尽可能保证所有班级都有抽到
)

asked_class_dict = {}    # 统计量: 班级人数为Xi的人>共抽到了几个人
for cyi in cy:  
    if cyi in asked_class_dict.keys(): asked_class_dict[cyi] += 1
    else:asked_class_dict[cyi] = 1


### 2. EM =====================================================================
# EM \theta _0 init  
theta = {k: 1 for k in asked_class_dict.keys()}

# run iter: ------------------
run_i = 20
while run_i > 0:
    run_i -= 1

    # 1. E-step: 依照{\theta}^t, 求P( Z | X, {\theta}^t )
    sigma = 0
    for k, v in theta.items():
        sigma += k * v
    sigma = len(cy) / sigma

    # 2. M-step: theta=argmax()
    for k, v in theta.items():
        theta[k] = round(asked_class_dict[k] / (k * v * sigma) * theta[k]) 
        if theta[k] < 1: theta[k] = 1


###  3. result showing ==============================================================
print_dict(theta,     "预测:{班级人数Ni: <人数为Ni的班级>共有多少个} \n\t")
print_dict(class_dict, "真实:{班级人数Ni: <人数为Ni的班级>共有多少个} \n\t")

N_class = 0
N_students = 0
for k, v in theta.items():
    N_students += k * v
    N_class += v

print("预测平均 = ", N_students / N_class)
print("真实平均 = ", sum(class_members)/classes )
print("街头抽样平均 = ", sum(cy)/len(cy))

点赞
收藏
评论区
推荐文章
基于SpringBoot实现单元测试的多种情境/方法(二)
本文分享自天翼云开发者社区@《》,作者:才开始学技术的小白1Mock基础回顾在上一篇分享中我们详细介绍了简单的、用mock来模拟接口测试环境的方法,具体的使用样例我们再回顾一下:1.首先是最简单的不需要传参的示例,需要注意的是,可能@Resource这个注
大数据通用组件故障处理
本文分享自天翼云开发者社区《》,作者:fnHDFS1.HDFS服务一直异常检查HDFS是否处于安全模式。检查ZooKeeper服务是否运行正常。2.HDFS维护客户端出现OutOfMemoryError异常使用HDFS客户端之前,需要在HADOOPCLIE
HBase Sync功能导致HBase入库性能下降
本文分享自天翼云开发者社区《》,作者:5m问题背景与现象HBase入库慢,regionserver日志中大量打印slowsync。原因分析1.对比正常写入时间段监控,检查HBase服务整体CPU、内存以及NameNodeRPC在异常时间段是否增加;2.检查
Flink和StreamPark自定义UDF函数的使用
本文分享自天翼云开发者社区《》,作者:王帅1、什么是函数在SQL中,我们可以把一些数据的转换操作包装起来,嵌入到SQL查询中统一调用,这就是“函数”(functions)。Flink的TableAPI和SQL同样提供了函数的功能。两者在调用时略有不同:Ta
centos安装safe-rm
本文分享自天翼云开发者社区《》.作者:王兰saferm是一个安全的rm命令替代品,用于防止误删重要文件。从EPEL仓库中安装,按顺序输入以下指令:sudoyumupdateysudoyuminstallyepelreleasesudoyuminstally
从random随机数看验证码重复数字
本文分享自天翼云开发者社区《》.作者:王淋推导:1.有6个不同数字(0个重复数字:111111):$$p(6)C10^66!\div10^6$$2.有5个不同数字(某个数字重复了2次:11112):$$p(5)(\fracC10^5C5^
Lua:善用luarocks管理公共库
本文分享自天翼云开发者社区《》.作者:王淋什么是LuarocksLuarocks是一个Lua包管理器,基于Lua语言开发,提供一个命令行的方式来管理Lua包依赖、安装第三方Lua包等,社区比较流行的包管理器之一Python具有PIP,Ruby具有Gems,
利特尔法则(little' law)在软件开发领域的应用
本文分享自天翼云开发者社区《》.作者:王淋一、引例(Example)先考虑一个小学数学问题:a)某小学每届1000名学生,6年制,请估算此刻该学校内学生总人数。很明显,6个年级每个都是1000,学生人数为100066000。这就是利特尔法则的直观体现。看上
聊聊Docker镜像
本文分享自天翼云开发者社区@《​​​​​​​​​》,作者:AE86上山了。前言回顾前面:为什么需要Docker?Docker入门为什么可以这么简单?在上篇也同样留下一个问题:我们知道Tomcat运行起来需要Java的支持,那么我们在DockerHub拉取下
探究Openresty中ngx.re与Lua string.re两种正则的选择
本文分享自天翼云开发者社区《》.作者:王淋0.背景openresty中存在2套正则API,即ngx.re与lua语言的string库,都可以实现正则匹配查找等功能,那么,这2个API有什么区别,又如何选择呢?1.性能测试1.1简单loop测试a)短字符串&
天翼云开发者社区
天翼云开发者社区
Lv1
天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。
文章
1.0k
粉丝
16
获赞
40