Подход к расчету «похожих» объектов на основе определенных взвешенных критериев - PullRequest
2 голосов
/ 15 января 2012

У меня есть сайт с несколькими объектами Project. Каждый проект имеет (например):

  • несколько тегов
  • несколько категорий
  • размер
  • несколько типов
  • и т.д.

Я хотел бы написать метод для захвата всех «похожих» проектов на основе вышеуказанных критериев. Я могу легко найти похожие проекты для каждого из вышеперечисленных по отдельности (например, проекты одинакового размера или проекты, имеющие общую категорию и т. Д.), Но я бы хотел, чтобы он был более интеллектуальным, чем просто выбор проектов, в которых есть все перечисленное выше, или проекты, имеющие хотя бы одно из перечисленных общих черт.

В идеале я хотел бы взвесить каждый из критериев, то есть проект, имеющий общий тег, менее «похож», чем проект, который близок по размеру и т. Д. Проект, имеющий два общих тега, более похож чем проект с одним общим тегом и т. д.

Какой подход (практически и математически) я могу использовать для этого?

Ответы [ 3 ]

4 голосов
/ 21 января 2012

Обычный способ справиться с этим (по крайней мере, в машинном обучении) - это создать метрику, которая измеряет сходство - метрика Жакара кажется здесь хорошим совпадением, учитывая, что у вас есть типы, категории , теги и т. д., которые на самом деле не являются числами.

Если у вас есть метрика, вы можете ускорить поиск похожих предметов, используя дерево KD, vp-дерево или другую структуру дерева метрик, если ваша метрика подчиняется неравенству треугольника (d (a, b)

1 голос
/ 21 января 2012

Проблема в том, что существует, очевидно, бесконечное количество способов решения этой проблемы.

Прежде всего, определите меру сходства для каждого из ваших атрибутов (сходство тегов, сходство категорий, сходство описаний, ...)

Затем попытайтесь нормализовать все эти сходства, чтобы использовать общую шкалу, например, От 0 до 1, где 0 является наиболее похожим, а значения имеют аналогичное распределение.

Далее присвойте каждой функции вес. Например. сходство тегов важнее описания сходства.

Наконец, вычислите комбинированное сходство как взвешенную сумму индивидуальных сходств.

Существует бесконечное количество способов, поскольку вы, очевидно, можете назначать произвольные веса, уже есть различные варианты сходства с одним атрибутом, бесконечное количество способов нормализации отдельных значений. И так далее.

Существуют методы для изучения весов. См. методы ансамбля . Однако, чтобы узнать вес, вам нужно знать, что является хорошим результатом, а что нет. У вас есть такие тренировочные данные ?

0 голосов
/ 21 января 2012
  1. Начните со значения 100 в каждой категории.
  2. Применение штрафов. Например, -1 для каждой разницы в размере в КБ или -2 для каждого тега, не найденного в другом проекте. В итоге вы получите значение 0,100 в каждой категории.
  3. Умножьте значение каждой категории на "вес" категории (т. Е. Сходство по размеру умножается на 1, сходство по тэгам с 3, сходство по типам с 2).
  4. Сложите взвешенные значения.
  5. Разделите на сумму весовых коэффициентов (в моем примере 1 + 3 + 2 = 6), чтобы получить общее сходство 0,100.

Возможности для уменьшения сравнения проектов ниже начального O (n ^ 2) (т.е. сравнение каждого проекта друг с другом) сильно зависят от контекста. Это может быть реальная суть вашего программного обеспечения, или это может быть не нужно вообще, если n низкий.

...