![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
s_a_s_h_a |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 261 Регистрация: 20.7.2004 Где: Петрозаводск Репутация: нет Всего: 1 |
Подскажите, пожалуйста, структуру данных для реализации алгоритма apriori.
Что использовать для транзацкий, что для наборов элементов, а что для множеств наборов элементов? |
|||
|
||||
s_a_s_h_a |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 261 Регистрация: 20.7.2004 Где: Петрозаводск Репутация: нет Всего: 1 |
согласен мало кто полезет смотреть что из себя представляет алгоритм, просто подумалось, а вдруг кто-нибудь уже реализовывал. В интернете есть и работающие коды и не совсем, но те работающие, что я находил либо без комментариев и сложные да еще и на других языках со своими структурами данных, либо слишком много лишнего.
Попытаюсь дать представление об алгоритме. Постановка задачи. Есть база транзакций D, каждая транзакция T - это набор элементов. Задача найти часто встречающиеся наборы элементов в базе транзакций. Например: a, b, d a, b, c, e f, a c, d d, e, a, b если задать уровень поддержки = 2, то данному уровню будут удовлетворять наборы: a, b встречается 3 раза a, d - 2 a, e - 2 b, e - 2 a, b, d - 2 одноэлементные наборы нам не нужны Кроме того необходимо найти ассоциативные правила: a => b с достоверностью 75% (из a следует b с достоверностью = число транзакций содержащих b / число транзакций содержащих a * 100%) a => {b, d} с достоверностью 50% и т.д. Псевдокод алгоритма: F1 = {часто встречающиеся 1-элементные наборы} для (k=2; Fk-1 <> ; k++) { Ck = Apriorigen(Fk-1) // генерация кандидатов для всех транзакций t T { Ct = subset(Ck, t) // удаление избыточных правил для всех кандидатов c Ct c.count ++ } Fk = { c Ck | c.count >= minsupport} // отбор кандидатов Результат U Fk Опишем функцию генерации кандидатов. На это раз нет никакой необходимости вновь обращаться к базе данных. Для того, чтобы получить k-элементные наборы, воспользуемся (k-1)-элементными наборами, которые были определены на предыдущем шаге и являются часто встречающимися. Вспомним, что наш исходный набор хранится в упорядоченном виде. Генерация кандидатов также будет состоять из двух шагов. 1. Объединение. Каждый кандидат Ck будет формироваться путем расширения часто встречающегося набора размера (k-1) добавлением элемента из другого (k-1)- элементного набора. Приведем алгоритм этой функции Apriorigen в виде небольшого SQL-подобного запроса: INSERT into Ck SELECT p.item1, p.item2, …, p.itemk-1, q.itemk-1 FROM Fk-1 p, Fk-1 q WHERE p.item1= q.item1, p.item2 = q.item2, … , p.itemk-2 = q.itemk-2, p.itemk-1 < q.itemk-1 2. Удаление избыточных правил. На основании свойства анти-монотонности, следует удалить все наборы c Ck если хотя бы одно из его (k-1) подмножеств не является часто встречающимся. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |