如何在n维中执行空间分区?

时间:2010-04-09 18:44:01

标签: algorithm math space-partitioning

我正在尝试将矢量量化的实现设计为c ++模板类,它可以处理不同类型和尺寸的矢量(例如16个字节的矢量字节,或4d矢量的双精度等)。

我一直在阅读算法,我理解其中的大部分内容:

herehere

我想实现Linde-Buzo-Gray(LBG)算法,但是我很难搞清楚用于分割群集的通用算法。我想我需要定义一个平面(超平面?),它将一组中的向量分开,这样平面的每一侧都有一个相等的数字。

[编辑以添加更多信息] 这是一个迭代过程,但我认为我首先找到所有向量的质心,然后使用该质心来定义分裂平面,得到平面每个边的质心,一直持续到我有了簇的数量VQ算法需要(迭代优化以减少沿途的失真)。上面第一个链接中的动画很好地展示了它。

我的问题是:

一旦我有质心,找到飞机的算法是什么?

如何测试矢量以查看它是否位于该平面的任何一侧?

2 个答案:

答案 0 :(得分:2)

如果你从一个质心开始,那么你必须将它分开,基本上是将它加倍并稍微向任意方向移动这些点。飞机只是与那个方向正交的平面。

但是你不需要计算那个平面。

更一般地,区域(i)被定义为更接近质心c_i而不是任何其他质心的点集。当你有两个质心时,每个区域都是半空间,因此被(超)平面隔开。

如何测试矢量x以查看它在飞机的哪一侧? (那是两个质心)

只需计算距离|| x-c1 ||和|| x-c2 ||,最小值(1或2)的索引将为您提供x点所属的区域。

更一般地说,如果你有n个质心,你可以计算所有距离|| x-c_i ||,并且质心x最接近(即,距离最小)会给你区域x是属于。

答案 1 :(得分:0)

我不太了解算法,但第二个问题很简单:

让我们调用 V 一个向 平面上的任何点延伸到点的向量。然后,该点位于(超)平面的同一侧,与正常 N iff V·N > 0