2016-11-14 3 views
0

У меня есть набор кортежей размера три в списке, представляющем оконные последовательности. Мне нужно использовать pyspask, чтобы иметь возможность получить (учитывая две первые части кортежа) третью.Недостаток извлечения последовательности префиксаSpan

Для этого мне нужно создать последовательности из трех элементов на основе их частоты.

Это то, что я делаю:

data = [[['a','b','c'],['b','c','d'],['c','d','e'],['d','e','f'],['e','f','g'],['f','g','h'],['a','b','c'],['d','e','f'],['a','b','c'],['b','c','d'],['f','g','h'],['d','e','f'],['b','c','d']]] 
rdd = spark.sparkContext.parallelize(data,2) 
rdd.cache() 
model = PrefixSpan.train(rdd, 0.2, 3) 

print(sorted(model.freqSequences().take(100))) 

Хотя, я бы ожидал увидеть последовательности и частоты о них следовать алфавит, они не делают.

И я получаю последовательности, как:

FreqSequence(sequence=[[u'c'], [u'd'], [u'b']], freq=1) 
FreqSequence(sequence=[[u'g'], [u'c'], [u'c']], freq=1) 

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

Спасибо!

ответ

1

Сначала давайте посмотрим на ваш вход:

rdd.count() 
1 

Как вы можете видеть, вы создали набор данных только с одной последовательностью. Это можно охарактеризовать как:

<(abc)(bcd)(cde)(def)(efg)(fgh)(abc)(def)(abc)(bcd)(fgh)(def)(bcd)> 

Так что узоры, которые вы получаете, действительно правильны с учетом ввода. Например

FreqSequence(sequence=[[u'c'], [u'd'], [u'b']], freq=1) 

соответствует:

...(abc)(def)(abc)... 

Если каждый элемент набора данных представляет собой отдельные данные последовательности могут иметь следующую форму:

rdd = sc.parallelize([ 
    [['a'], ['b'], ['c']], [['b'], ['c'], ['d']], [['c'], ['d'], ['e']], 
    [['d'], ['e'], ['f']], [['e'], ['f'], ['g']], [['f'], ['g'], ['h']], 
    [['a'], ['b'], ['c']], [['d'], ['e'], ['f']], [['a'], ['b'], ['c']], 
    [['b'], ['c'], ['d']], [['f'], ['g'], ['h']], [['d'], ['e'], ['f']], 
    [['b'], ['c'], ['d']] 
]) 

rdd.count() 
13 
rdd.first() 
[['a'], ['b'], ['c']] 

где:

  • Каждый элемент представляет собой список списков.
  • Каждый внутренний список представляет собой возможные альтернативы в данной позиции.

С данными структурированных следующим образом:

model = PrefixSpan.train(rdd, 0.2, 3) 
model.freqSequences().top(5, key=lambda x: len(x.sequence)) 
[FreqSequence(sequence=[['d'], ['e'], ['f']], freq=3), 
FreqSequence(sequence=[['b'], ['c'], ['d']], freq=3), 
FreqSequence(sequence=[['a'], ['b'], ['c']], freq=3), 
FreqSequence(sequence=[['f'], ['g']], freq=3), 
FreqSequence(sequence=[['d'], ['f']], freq=3)] 
model.freqSequences().top(5, key=lambda x: x.freq) 
[FreqSequence(sequence=[['d']], freq=7), 
FreqSequence(sequence=[['c']], freq=7), 
FreqSequence(sequence=[['f']], freq=6), 
FreqSequence(sequence=[['b']], freq=6), 
FreqSequence(sequence=[['b'], ['c']], freq=6)] 
+0

спасибо много для объяснения всего этого! – Kratos

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