计算3D(或者n-D)质心的最佳方法是什么?

时间:2020-03-05 18:57:23  来源:igfitidea点击:

作为工作项目的一部分,我必须计算3D空间中一组点的质心。现在,我以一种似乎简单但幼稚的方式进行操作-通过取每组点的平均值,如下所示:

centroid = average(x), average(y), average(z)

其中x,y和z是浮点数的数组。我似乎记得有一种方法可以获取更准确的质心,但是我还没有找到一种简单的算法来实现。有人有什么想法或者建议吗?我为此使用Python,但是我可以改编其他语言的示例。

解决方案

回答

不,这是点集质心的唯一公式。参见Wikipedia:http://en.wikipedia.org/wiki/Centroid

回答

你说对了。我们要计算的是质心或者均值向量。

回答

我认为"更精确的质心"是我们计算时定义的质心,因此不可能有"更准确的质心"。

回答

我们可以使用增加精度的求和Kahan求和是我们所想的?

回答

是的,那是正确的公式。

如果我们有很多点,则可以利用问题的对称性(圆柱,球形,反射镜)。否则,我们可以从统计信息中借用并取平均随机数的点,并且会有一点误差。

回答

可能更有效:如果要多次计算,则可以通过保留两个固定变量来大大提高速度

N  # number of points
sums = dict(x=0,y=0,z=0)  # sums of the locations for each point

然后在创建或者销毁点时更改N和总和。每次将点创建,移动或者销毁时,这都会从O(N)更改为O(1),以进行更多的工作为代价。

回答

我们含糊地提及"一种获得更精确质心的方法"。也许我们在说的是不受异常值影响的质心。例如,美国的平均家庭收入可能很高,因为少数非常富有的人会偏离平均水平。他们是"离群值"。因此,统计人员改用中位数。获取中位数的一种方法是对值进行排序,然后在列表的一半位置选择值。
也许我们正在寻找类似这样的东西,但是要寻找2D或者3D点。问题是,在2D及更高版本中,我们无法排序。没有自然的秩序。但是,有一些方法可以消除异常值。
一种方法是找到这些点的凸包。凸包的所有点都在点集的"外部"。如果执行此操作,并丢弃船体上的点,则将抛出异常值,剩余的点将提供更"代表性"的质心。我们甚至可以重复此过程数次,结果有点像剥洋葱。实际上,它被称为"凸壳剥皮"。