В настоящее время я разрабатываю приложение, в котором я хочу сгруппировать похожие элементы.Элементы (например, видео) могут быть созданы пользователями, а также их атрибуты могут быть изменены или расширены позже (например, новые теги).Вместо того чтобы полагаться на предпочтения пользователей, как это делает большинство механизмов совместной фильтрации, я хочу сравнить сходство элементов на основе атрибутов элементов (таких как одинаковая длина, похожие цвета, аналогичный набор тегов и т. Д.).Вычисления необходимы для двух основных целей: предложение x
похожих элементов для данного элемента и для кластеризации в группы похожих элементов.
Мое приложение до сих пор работает в асинхронном режиме, и я хочу отделить эту кластеризациюКомпонент, насколько это возможно.Создание новых элементов или добавление новых атрибутов для существующего элемента будет объявляться путем публикации событий, которые компонент может затем потреблять.
Вычисления могут быть предоставлены с максимальным усилием и «моментальным снимком», что означает, что я 'все в порядке с наилучшим возможным результатом в данный момент времени, хотя качество результата в конечном итоге возрастет.
Поэтому я сейчас ищу подходящие алгоритмы для вычисления как похожих элементов, так и кластеров.Важным ограничением является масштабируемость.Первоначально приложение должно обрабатывать несколько тысяч элементов, но в дальнейшем возможны и миллионы элементов.Конечно, вычисления затем будут выполняться на дополнительных узлах, но сам алгоритм должен масштабироваться.Было бы также неплохо, если бы алгоритм поддерживал какой-то инкрементальный режим при частичных изменениях данных.
Моя первоначальная мысль о сравнении каждого элемента друг с другом и сохранении числового сходства звучит немного грубо.Кроме того, требуется n*(n-1)/2
записей для хранения всех сходств, и любое изменение или новый элемент в конечном итоге приведут к n
вычислениям сходства.
Заранее спасибо!
ОБНОВЛЕНИЕ tl; др
Чтобы уточнить, чего я хочу, вот мой целевой сценарий:
- Пользователь создает записи (представьте документы)
- Пользователь редактирует метаданные записи (представьте теги)
И вот что должна предоставить моя система:
- Список похожих записей для данного элемента в качестве рекомендации
- Кластеры похожих записей
Оба вычисления должны основываться на:
- метаданные / атрибуты записей (т.е. использование похожих тегов)
- Таким образом, расстояние между двумя записями с использованием соответствующих метрик
- НЕ основано на пользовательских голосованиях, предпочтениях или действиях (в отличие от совместной фильтрации).Хотя пользователи могут создавать записи и изменять атрибуты, вычисления должны учитывать только элементы и их атрибуты, а не пользователей, с которыми они связаны (как в системе, где существуют только элементы и нет пользователей).
В идеале алгоритм должен поддерживать:
- постоянные изменения атрибутов записи
- инкрементно вычислять аналогичные записи / кластеры при изменениях
- масштаб
- что-то лучше, чем простая таблица расстояний, если это возможно (из-за сложности пространства O (n²))