![]() |
|
|
![]()
|
|
| Megas |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 15.1.2006 Репутация: нет Всего: нет |
День добрый. Надеюсь я пишу в правильном разделе.
Дано: Имеется большой список людей (пользователей). Имеется некий набор... допустим флажков. Количество флажков постоянно. У каждого пользователя может быть некий набор этих флажков, от ниодного, до абсолютно всех (и все другие промежуточные вариации). Что нужно: Нужно найти для одного из пользователей список из других пользователей (к примеру человек 5) у которых имеется похожий набор флажков. Всё, на что хватило моей фантазии, это генерировать для каждого пользователя некий хеш его флажков... (к примеру если у нас 5 видов флажков и у пользователя есть первый и третий, то его хеш будет: 10100 [1-значит есть, 0-значит нет флажка]). Затем пробегаться по всем пользователям и сравнивать их хеши с текущим пользователем выдавая при этом некую оценку совпадения. За каждое совпадение прибавлять к оценке 1, а за не совпадение отнимать 1. Затем после этого брать 5 пользователей у которых самая большая оценка. Данное решение дает хороший результат, но очень медлитильно при большом количестве флажков и пользователей. После небольших размышлений пришел к тому, что можно ускорить поиск жертвуя точностью. К примеру для каждого пользователя можно также сохранять количество имеющихся у него флажков и проверять только тех у кого примерно похожее количество. К примеру если у пользователя 10 флажков, то сверять его хеш только с теми у кого +-3 флажков (т.е. от 7 до 13). Но боюсь, что такой способ поиска сильно ударит по точности. Может кто подскажет как можно улучшить алгоритм не жертвуя при этом точностью? Да и воопще готов выслушать любые варианты реализации. |
|||
|
||||
| VictorTsaregorodtsev |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 28.7.2006 Репутация: 3 Всего: 8 |
Раздел правильный. Может, кто и подскажет - но я не буду ;)
Описана задача, которая сейчас широко востребована, например, в интернет-магазинах и для таргетирования интернет-рекламы, да и вообще в торговле чуть ли не ЛЮБЫМИ товарами и услугами (при широкой номенклатуре предлагаемого товара). "Флажки" есть аналог совершения тех или иных покупок/действий, надо для конкретного пользователя найти ряд других пользователей с аналогичным поведением/предпочтением - посмотрев, какие еще действия и покупки ранее совершали "похожие" пользователи, можно будет предложить текущему эти самые варианты (которыми, предположительно, он заинтересуется с бОльшей вероятностью, чем другим случайно выбранным товаром). На подобных задачах я деньги зарабатываю, и называть широкому кругу лиц алгоритмы и где почитать - увольте ;) Кстати, на русском обзывают такие алгоритмы кучей доморощенных названий, причем калька с формального английского двухсловного названия встречается в рунете всего на 16 страницах и 10 сайтах (пару недель назад смотрел), одна из этих страниц - в википедии, но ещё пустая (а алгоритмы начали активно разрабатываться 15 лет назад, первая же публикация была в 92). |
|||
|
||||
| Фантом |
|
||||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 2 Всего: 49 |
Наверное, стоит сразу внести одно уточнение. Ваша формулировка предполагает две, вообще говоря, существенно разные задачи. Один вариант - известен точный критерий "похожести", и задача состоит в быстром поиске всех объектов, похожих на данный. Немного видоизмененный вариант - некоторого количества похожих объектов (существенно меньшего, чем все имеющиеся похожие). Второй вариант - разделение объектов на классы "похожести" по некоторому заранее неизвестному критерию. В этом случае, как правило, ограничено число возможных классов, к которым следует отнести все (или хотя бы значительную часть) имеющихся объектов. Соответственно, для начала определитесь - какую из двух задач Вы решаете.
Хм... как говорится, ничего личного, но я бы в такой ситуации либо поделился бы информацией, либо помолчал. |
||||
|
|||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 5 Всего: 121 |
Если рассматривать флажки как признаки, то каждый набор флажков (соответствующий одному пользователю) можно рассматривать как точку в многомерном пространстве признаков. Соответственно все пользователи будут "кластеризоваться" в этом пространстве согласно своим предпочтениям. А дальше уже можно применять различные метрики и апроксимации, хоть простое евклидово расстояние, хоть НС.
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| Megas |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 15.1.2006 Репутация: нет Всего: нет |
VictorTsaregorodtsev, соглашусь с тов-щем Фантом, если уж не хотите делится никакой информацией, то лучше ничего не писать. Но я был бы признателен, еслиб вы поделились хотябы ссылками на упомянутые 10 сайтов.
Фантом, идея с разделнием флажков на классы вполне интересна, надо будет подумать над этим. Хотя конечно же хотелось более точного результата, где каждый флажок является уникальным. W4FhLF, к сожалению флажки плохо разбиваются на признаки (или как выше было предложенно, на классы), поэтому данный способ не очень подходит. :( |
|||
|
||||
| Pavia |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
Megas,
Какое количество пользователей и флажков?
Не обязательно проходить по всем. Пользуйся деревьями. А вообще я бы загнал в БД и предоставил бы эту работу СУБД она сама прекрасно справиться без вас. |
|||
|
||||
| Megas |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 15.1.2006 Репутация: нет Всего: нет |
Pavia, флажков сотни, а пользователей сотни тысяч. В принципе эту проблему я и решаю частично с помощью СУБД. Но я не совсем понимаю, как она может мне помочь кроме как предоставить данные в удобочитаемом виде? Если есть идеи по этому поводу, то я использую MySQL.
П.с. не совсем понял причем тут деревья? имхо, они совершенно тут не помагают. Это сообщение отредактировал(а) Megas - 10.2.2010, 20:08 |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 5 Всего: 121 |
Megas, посмотри сюда: http://mechanoid.narod.ru/nns/memory/
Возможно этот вид нейронных сетей поможет тебе решить задачу. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 7 Всего: 386 |
Ну да. Остается найти "места скоплений" получившихся точек и золотой ключик в кармане. Визуальная картинка: представим, что у нас 3 разных флага, наличие или отсутствие его будем отмечать 0 или 1. получим вектор, к примеру, у нас есть комплекты флагов (0,1,1) , (1,1,1) и (0,0,0). расстояние между первым и двумя остальными 1 и корень из 2, соответственно. (вспоминаем тригонометрию?). Итого - первый и второй более похожи, чем первый и третий. imho - это уже практически готовое решение.. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 2 Всего: 49 |
Как вариант. В такой постановке (я вот так и не понял, этого хочет топикстартер или нет) для этой задачи существует много стандартных методов решения. Ключевые слова для поиска в интернете и литературе - "кластерный анализ". |
|||
|
||||
| Megas |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 15.1.2006 Репутация: нет Всего: нет |
Обдумал идею с многомерным пространством... в целом идея интересная, но если призадуматся, то чтото подобное я и так использую.
Ведь я создаю некий хеш (к примеру: 1010011100...), который можно воспринять как некий тип записи координаты точки в пространстве (где каждая цифра означает координату, а её значение - позиция точки на этой координате). Но в моём случае вычислять близость двух точек гораздо проще, ведь я использую обычное сложение и вычитание (всё описано в первом сообщении), а не корень. Хоть это и дает более грубый результат в плане точности, но работает гораздо быстей. А я ищу ещё более быстрый вариант. Это сообщение отредактировал(а) Megas - 14.2.2010, 14:48 |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 7 Всего: 386 |
Megas, Экономить на корнях? Хм... а откуда флажки-то берутся? Сдается мне. что экономить надо начинать с базы данных .
Для примерчика - разница между хешем 10000000000111 и 00000000000111 должна быть не очень большой, если подключать к этому элементарную логику. А как отнесутся к такому "сложение и вычитание"? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 5 Всего: 121 |
Вообще это глупости. Во-первых просто неверно рассматривать хеш как отображение данных в многомерном пространстве, а сложение вычитание как метрику этого пространства. Это, простите, фигня какая-то -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
W4FhLF, ну метрики разные бывают, в том числе и максимальная разность координат, например. Другое дело, что метрика - это не любая формула, она должна обладать определенными свойствами, чтобы метрикой быть. В этом смысле фигня, согласна. А вообще задача, как уже было сказано, на кластеризацию: определить множество близких точек. В каком-то смысле, что определяется как раз метрикой. А дальше уже можно оптимизировать, чтобы побыстрее считалось. Но никак не наоборот.
-------------------- ... |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |