Я пытаюсь спроектировать реализацию векторного квантования как шаблонный класс c ++, который может обрабатывать разные типы и измерения векторов (например, 16-байтовые векторы байтов или 4d-векторы двойников и т. Д.).
Я перечитывал алгоритмы и понимаю большинство из них:
здесь и здесь
Я хочу реализовать алгоритм Линде-Бузо-Грея (LBG), но мне сложно разобраться в общем алгоритме разделения кластеров. Я думаю, что мне нужно определить плоскость (гиперплоскость?), Которая разделяет векторы в кластере, чтобы на каждой стороне плоскости было одинаковое число.
[изменить, чтобы добавить больше информации]
Это итеративный процесс, но я думаю, что начну с нахождения центроида всех векторов, затем использую этот центроид, чтобы определить плоскость расщепления, получая центроид каждой из сторон плоскости, продолжая, пока у меня не будет количества кластеров необходим для алгоритма VQ (итерация для оптимизации для меньшего искажения по пути). Анимация в первой ссылке выше показывает это хорошо.
Мои вопросы:
Что такое алгоритм для поиска плоскости, когда у меня есть центроид?
Как проверить вектор, чтобы увидеть, находится ли он по обе стороны от этой плоскости?