我正在尝试将矢量量化的实现设计为c模板类,其可以处理不同类型和尺寸的向量(例如,16个字节的维度向量,或者双向的4d向量等).
我一直在阅读算法,我理解其中的大部分内容:
我想实现Linde-Buzo-Gray(LBG)算法,但是我很难搞清楚用于分割簇的通用算法.我想我需要定义一个平面(超平面?),它将一组中的向量分开,这样平面的每一侧都有一个相等的数字.
[编辑添加更多信息]
这是一个迭代过程,但我认为我首先找到所有向量的质心,然后使用该质心来定义分裂平面,得到平面每个边的质心,一直持续到我有了簇的数量VQ算法需要(迭代优化以减少沿途的失真).上面第一个链接中的动画很好地展示了它.
我的问题是:
一旦我有了质心,找到飞机的算法是什么?
如何测试矢量以查看它是否位于该平面的两侧?
最佳答案 如果你从一个质心开始,那么你必须将它分开,基本上是将它加倍并稍微向任意方向移动这些点.平面就是与该方向正交的平面.
但是你不需要计算那个平面.
更一般地,区域(i)被定义为更接近质心c_i而不是任何其他质心的点集.当你有两个质心时,每个区域都是半空间,因此被(超)平面隔开.
如何测试矢量x以查看它在飞机的哪一侧? (那是两个质心)
只需计算距离|| x-c1 ||和|| x-c2 ||,最小值(1或2)的索引将为您提供x点所属的区域.
更一般地说,如果你有n个质心,你可以计算所有距离|| x-c_i ||,并且质心x最接近(即,距离最小)会给你x所属的区域.