2

В принципе у меня есть файловая система, полный файлов, как это:найти сходство между двумя несколькими dimensial массивами (как JSON документы)

{"excellent":[1,2],"good":[1,2,3,4,5],"okay":[6],"bad":[7,8,9],"horrible":[9]} 

«отлично» всегда будет подмножеством «хорошо», «ужасный» будет всегда быть подмножеством «плохо», и хорошо, плохо, и все в порядке всегда будет уникальным. Однако каждый набор может быть сколь угодно длинным, от 0 элементов до ... произвольных. Я не могу предположить, что длина двух множеств будет одинаковой, поэтому Jaccard, похоже, применим к отдельным наборам.

Что мне нужно сделать, это вычислить:

  1. Top 25 документов наиболее близок к этому.
  2. Внизу 10 документов, наименее похожих на этот.
  3. Значение между 0-1 между этим документом и всеми другими документами в наборе.

По существу, выход должен быть другой документ JSON как это:

{"similar":[[1,0.987],[2,0.876],[3,0.765]...],"differs":[[4,0.012],[5,0.123],[6,0.234]...],"totalSimilarity":0.456} 

Я посмотрел на Jaccard индексах, и что хорошо выглядит для простого массива. Это набор из пяти массивов, и очень важно, чтобы два документа имели сходство между их хорошими и отличными наборами, например.

Могу ли я просто «усреднить» пять ярлыков «Жаккар» в один номер ведущего индекса? Или это слишком много информации?

Я слишком стараюсь? Будет ли что-то вроде Minhash из json-струн работать? Моя первая мысль заключается в том, что это возможно, но тогда я обеспокоен тем, что что-то, основанное на хешировании строк, будет считать «5» «ужасным», поскольку «похоже» на «5» находится в «хорошем», и это полностью назад. Кроме того, я боюсь, что этому мешает тот факт, что некоторые пользователи могут иметь сто записей под «хорошим», в то время как другие просто имеют пять, и вычисление на основе строк может задохнуться от этого.

И, честно говоря, хотя я хочу, чтобы значение для # 3 выше, я действительно не знаю, как рассчитать это. Я хотел бы знать, как подобный документ относится ко всему корпусу.

Да, это похоже на алгоритм системы рекомендаций. Я прочитал документацию от EasyRec до Mahout, и либо они, похоже, не делают то, что мне нужно, или математика начинает идти по моей голове. Я разработчик PHP, а не физик-теоретик. Такие системы, как EasyRec и Mahout, по-видимому, не «понимают» тот факт, что это пять отдельных наборов, которые ВСЕ должны согласовать, чтобы их считали «похожими ...» или им требуются некоторые серьезные усилия по программированию в их рамках, которые оставьте меня немного головокружение.

Однако, достаточно интересно (по крайней мере, для меня), большинство рекомендаций систем работают на весь набор данных; Меня особенно интересует кластеризация пользователей на основе их предпочтений и рекомендации, основанные на этом очень маленьком наборе. Я честно не слишком беспокоюсь о том, чтобы сказать «не знаю, Бак! Ты слишком уникален», поэтому я не слишком обеспокоен холодным стартом или чем-то подобным.

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

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

Я обнаружил, что большинство систем рекомендаций/рейтинговых систем терпят неудачу, потому что их наборы данных слишком широки. Попытка усреднить оценку по всей вселенной создает посредственность (см .: Metacritic, Rotten Tomatoes). В основном я хочу сказать, прозрачно, конкретному пользователю:

Пользователи, наиболее похожие на вас (ссылка, ссылка, ссылка) действительно так, и пользователи не похожи на вас (ссылка, ссылка, ссылка) на самом деле ненавижу это, так что вам может быть интересно.

Пользователи, наиболее похожие на вас (ссылка, ссылка, ссылка) согласны с тем, что это хорошо, поэтому вам может быть интересно.

Пользователи, наименее похожие на вас (ссылка, ссылка, ссылка) согласны с тем, что это ужасно, так что вам может быть интересно.

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

Я хочу изложить его пользователю, ТОЧНО, как я пришел к мысли, что им понравится X, так как многие рекомендации на веб-сайтах - это черные ящики, и я считаю, что это может быть очень плохо с нулевым объяснением. (Пивные веб-сайты рекомендуют три IPAs после того, как я последовательно оцениваю каждый IPA, который я выпиваю «1», просто потому, что существует много IPAs, и мир, похоже, напоминает IPAs.)

Вот почему я хочу «totalSimilarity». Если ваша «totalSimilarity» невелика, рекомендация будет крутиться вокруг, и я хотел бы показать это как оправдание. «Вы очень уникальны, поэтому на самом деле это просто захватывающие догадки». «Вы не очень неудобны, что на самом деле хорошо, потому что я уверен, что эти данные полезны для вас лично».

ответ

0

Вот первый набросок решения:

1) удалить избыточность из ваших данных:

  • вы говорите, что «отлично» всегда будет подмножеством «хорошо», «ужасный» будет всегда быть подмножеством «плохого». Тогда ваши данные излишни. Удалите отличные записи из хороших записей и ужасные записи из плохих записей.

2) Используйте численные весы вместо слов. Вы можете использовать следующее отображение: отличное -> 2, хороший -> 1, ОК -> 0, плохо -> -1, ужасный -> -2

  • Таким образом, вы в конечном итоге с пользователем элемент матрицы. С одной линией на пользователя и одной колонкой на
    . Числовые записи представляют собой предпочтения пользователя для данного элемента. Полученная матрица будет разреженной и высокой размерностью. Вам нужно будет применить механизм сокращения размерности , такой как анализ основных компонентов или сингулярная декомпозиция значения стоимости .

3) Как только вы уменьшили размерность своей проблемы, вы можете вычислить сходство между пользователями и элементами, используя точечный продукт в сокращенном пространстве.

+0

Спасибо, что приняли мой ответ. Вы реализовали его таким образом? Я хотел бы услышать о вашем решении. – user152468

Смежные вопросы