使用EMD作为距离度量来找到某些直方图的“中心”

问题描述

鉴于一些相同数量的桶的直方图,我需要找到这些直方图的“中心”。 “中心”是一个直方图,以使地球行者到其他所有直方图的距离之和最小。

例如,给定4个直方图ABCD,该算法需要输出新的直方图X,使得{{ 1}}是最小值。

简单的算术平均值找不到“中心”,here是一个例子。

我需要计算数百万个直方图的“中心”,因此如何有效地找到“中心”。如果不存在快速算法,那么有没有好的近似值?

===编辑===

添加了一个示例来阐明我的问题。

解决方法

推土机距离非正式地将每个分布或在这种情况下将直方图视为一堆土。然后根据EMD找到中心,包括找到使直方图单位面积乘以必须移动的距离的乘积最小的点。例如。移动一个带有7个成员的直方图容器与移动一个带有7个成员的直方图容器具有相同的EMD。为了简单起见,我假设您的分布只有一个维度,但是如果没有这个中心点,则可以沿着每个维度独立地找到它。

推土机距离实际上与物理学或静力学中的一个概念非常相似; 第一时刻。形状的第一矩定义为每个面积单位乘以该面积单位距中心点的距离的乘积。找到中心点,以使中心点每一侧的总面积(沿任何主要尺寸)都相同。

静力学爱好者会回想起该中心点实际上实际上只是沿每个维度的面积分布的平均值。 EMD定义得出的结果相似。因此,要找到您的直方图组的EMD重心,请执行以下操作:

将每个垃圾箱的每个成员作为一个单元进行处理。为每个单元分配与该仓关联的值。因此,如果对于给定的维度,箱0-10有5个条目,则您有5个单位,每个单位的值为5(箱的平均值)。找到所有单位的中位数,这是该维度的质心值。如果有多个尺寸,则对所有尺寸重复上述操作,就是这样!

在这个带有2个直方图的琐碎示例中,将每个bin元素视为一个单位后,中位数(因此是中心)为4。显然,将中心移动到4之上或之下将导致EMD增大5并减小由4。

深入探讨您的问题,您可以比对所有直方图元素进行排序来找到中位数要好一些,而不是使用QuickSelect获得平均时间复杂度为O(n),最坏情况为O(nlogn)

。 ,

如果通过“中心”指的是中位数,则需要对数据集进行排序;在这种情况下,直方图已经排序。可以理解,直方图的数据可能不会以列表形式出现;但是,由于没有其他替代方法,因此答案将按这样构成。

原始数据:值列表 直方图数据:元组列表“(((最小,最大),数量)”

可用原始数据

#all data from histogram w/o bucket approximation
data = []
#sorting algorithm should be optimized for the size of the dateset 
#skip this step if data set sorted
data.sort()
median = (data[int(len(data)/2)]+data[round(len(data)/2)])/2

直方图数据:

#data from histogram only
data = []
#sort by min
#skip this step if histogram is already sorted
sort(key=lambda x:x[0][0])
#n is the data quantity
n = sum([bucket[1] for bucket in data])

#loop checks to see if median is captured in current bucket 
#by expanding the "net" by the current bucket size
rollingQuant = 0
median = None
for bucket in data:
    rollingQuant += bucket[1]
    #if median captured in bucket True
    if rollingQuant >= n/2:
        median = bucket[0]

问题:

    仅凭直方图数据无法计算的中值可以估算;估算的一个例子是定义带有最小最大和桶中点数的线性方程。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...