原文地址:http://www.johndcook.com/blog/2009/06/23/tukey-median-ninther/
Tukey’s “ninther” or “median of medians” procedure is quite simple. Understanding the problem he was trying to solve is a little more difficult.
要搞懂这个“第九层”或者中间的中间这个过程是很简单的,但是要搞懂这个过程是要解决什么问题是有一点复杂。
综述
中间:值位于三个对比样本的中间哪一个,是逻辑上的中间,不是物理上或者存储位置上的中间
想象你有九个点y1,y2,y3,y4,y5,y6,y7,y8,y9
,我们将yA设置为前三个样本的中间节点,yB设置为中间三个样本的中间节点,yC设置为后三个样本的中间节点,所谓的“第九层”(ninther)数据集就是yA,yB,yC的中间节点。
比如:如果你有这样的一个数据集:{3,1,4,4,5,9,9,8,2}
则可以得到yA,yB,yC为:
yA = median( 3, 1, 4 ) = 3
yB = median( 4, 5, 9 ) = 5
yC = median( 9, 8, 2 ) = 8
故有
median( 3, 5, 8 ) = 5
中位数就在4
这个位置上
这就是Tukey的解决方法,所以它所解决的问题是什么呢?
问题
首先,这个方法尝试去建一个大的数据集的中间值。考虑到数据是来自于一个均衡的分布式结构,所以其平均值等同于其中位数。这个方法是一个鲁棒的平均值评估方法,同时这个方法可以很优秀地规避极端值的影响,这就是为什么他使用中位数而不是平均值去进行计算。
那么为什么不直接用中位数,而去LgN次第求出中位数的中位数的中位数..呢?
计算样本的中位数需要以下几个要点
* 存储所有的值
* 对所有的值进行排序
* 选出中间的值就是中位数
Tukey的中位数计算方法想要不对所有的值进行存储,同时,他也希望尽可能地减少比较操作和算数操作的消耗。他的ninther操作没有使用任何计算操作而仅仅是一些比较,事实上对于每个数据点平均下来只进行了1.1次比较,在最坏的例子里面也只进行了1.33次比较
表现
那么这个算法的表现如何呢?
对于普通的分布式系统,这个算法比采样平均(sample mean)快了将近55%,同时计算的方差是采样平均的一半以下。但是稳健统计的研究对象是建立在不一定甚至不可能普通分布的数据集,而一般是极端倾斜的数据集。这个算法改进了对于数据来源于倾斜数据集的效率表现。
从哪里进来的大型数据集?到目前为止,我们只谈到了九分的分析数据集。杜克的想法是使用ninther与中位数结合。对于一些有9M个点的大型数据集,可以将9M个点使用这个算法分组成9个点并求这M个9个点的中间值。这仍然需要计算的M个点的中位数,但对存储器的要求已减少到九分之一。同时,该分选时间已经减少了超过9:1的因素,因为分拣n个点需要时间正比于Nlog N。
对于更大的数据集,杜克建议进行81分数据,并计算ninthers的ninther。然后81M的数据点可以通过存储和排序M值进行处理。
杜克设M = 1,000,000,也就是所谓的“不切实际的大的数据集”。
我想找到81万个数据点的中位数在1978年是不切实际的,虽然它是今天一个微不足道的问题。