Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 以EMD作为距离度量,找出一些直方图的“中心”_Python_Histogram_Mean_Metrics_Earth Movers Distance - Fatal编程技术网

Python 以EMD作为距离度量,找出一些直方图的“中心”

Python 以EMD作为距离度量,找出一些直方图的“中心”,python,histogram,mean,metrics,earth-movers-distance,Python,Histogram,Mean,Metrics,Earth Movers Distance,给定一些相同数量的桶的直方图,我需要找到这些直方图的中心。该中心是一个柱状图,因此,从所有其他柱状图到该中心的土方机距离之和是最小的 例如,给定4个直方图A、B、C、D,算法需要输出一个新的直方图X,使得EMDX、A+EMDX、B+EMDX、C+EMDX、D最小 简单的算术平均数找不到中心,就是一个例子 我需要计算数百万个柱状图的中心,因此如何才能有效地找到中心。如果不存在快速算法,是否存在良好的近似值 ==编辑=== 添加了一个示例来澄清我的问题。如果按中心指的是中值,则需要对数据集进行排序;

给定一些相同数量的桶的直方图,我需要找到这些直方图的中心。该中心是一个柱状图,因此,从所有其他柱状图到该中心的土方机距离之和是最小的

例如,给定4个直方图A、B、C、D,算法需要输出一个新的直方图X,使得EMDX、A+EMDX、B+EMDX、C+EMDX、D最小

简单的算术平均数找不到中心,就是一个例子

我需要计算数百万个柱状图的中心,因此如何才能有效地找到中心。如果不存在快速算法,是否存在良好的近似值

==编辑===


添加了一个示例来澄清我的问题。

如果按中心指的是中值,则需要对数据集进行排序;在这种情况下,直方图已经排序。可以理解,直方图的数据很可能不是列表形式;但是,由于没有其他选择,因此答案的结构将是这样的

原始数据:值列表 直方图数据:元组列表最小值、最大值、数量

可获得的原始数据:

#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]
问题:

只有直方图数据无法计算的中值可以估计;估计的一个例子是定义具有最小最大值和桶中点数的线性方程。
土方运输机距离非正式地将每个分布或在本例中的柱状图视为一堆泥土。然后,根据EMD找到中心,包括找到使每个单位直方图面积乘以必须移动距离的乘积最小的点。例如,将一个包含7个成员的直方图单元移动到一个单元与将一个包含1个成员的直方图单元移动到7个单元具有相同的EMD。为了简单起见,我假设您的分布只有一个维度,但如果没有,则可以沿着每个维度独立找到该中心点

地球移动器的距离实际上相当类似于物理学或静力学中的一个概念;第一刻。形状的第一个力矩定义为每单位面积乘以该单位面积距中心点的距离的乘积。找到中心点时,中心点每侧沿任何主尺寸的总面积都是相同的

静力学的爱好者会记得,这个中心点实际上只是沿每个维度面积分布的平均值。EMD定义产生了类似的结果。因此,要找到直方图组的EMD质心,请执行以下操作:

将每个料仓的每个成员视为单个单元。为每个单元分配与该存储箱关联的值。因此,如果给定尺寸的料仓0-10有5个条目,则有5个单位,每个单位的值为料仓的平均值5。找到所有单位的中值,这是该尺寸的质心值。如果有多个维度,则对所有维度重复此操作,仅此而已

在这个具有2个直方图的简单示例中,将每个bin元素作为一个单元处理后,中位数和中心是4。显然,将中心移动到4以上或以下将导致EMD增加5,并减少4


说到问题的核心,你可以做得比对所有直方图元素进行排序以找到中位数稍微好一些,而不是使用QuickSelect来获得平均时间复杂度,只有最坏的情况。

这可能是中心极限定理吗?你能对此进行一点阐述,或者给出一个简单的例子,我不太清楚您需要什么样的答案或用例。此外,它们是相同的范围、形状还是歪斜?更准确地说,中心是分布的平均值,根据EMD最好地代表了历史记录的集合否,只有分布均匀时才是如此。这样想吧:在比尔·盖茨、杰夫·贝佐斯、埃隆·马斯克、三位无家可归的老兵和一位老师的挑选中,你有7个人。如果你按平均数计算,他们都是亿万富翁,四个人都很幸福。取中位数,你就会看到老师和他/她的工资。1/2的人在定义上高于/低于中位数。但是150名无家可归的兽医和贝佐斯-平均值仍然超过10亿美元。在这种情况下,中位数是更好的测量中心度的方法。是否有理由特别需要使用推土机的距离?昨晚,我快速运行了一个1000万个中等偏态分布图的案例,花了不到30秒的时间。正如里希耶夫所猜测的,你似乎在寻找一个中心极限定理的图形例子。嘿,在这个问题被否决之前让你知道,你的代码已经关闭了。例如,[134、288、291、295、310、339、376、395、409、450、720、729、751]的中位数是多少?如果您的意思是代码不补偿刚刚固定的偶数列表;此外,对于13个长列表,您的数据输出当前为376.0。