Кортеж является подмножеством другого кортежа - Apriori algortihm - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь реализовать алгоритм априори.На одном из последних шагов у меня есть два массива кортежей, сгенерированных из списка продуктов.

>>> arr1 = array([(2421,), (35682,), (30690,), ..., (18622,), (18285,), (31269,)],
  dtype=object)

>>> arr2 = array([(2421, 35682), (2421, 30690), (2421, 24852), ..., (18622, 18285),
   (18622, 31269), (18285, 31269)], dtype=object))

Смысл в том, что мне нужно проверить, какие из arr1 являются подтипами arr2, то есть (2421, ) - это подтип (2421, 30690).

. Я попытался

>>> if (2421,) in (2421, 1231):
...    print('Yes')
... else:
...    print('No')

и получил No.Я также пытался использовать .issubset, но я получаю AtributeError.

Я хотел бы знать, как я могу сделать это, не идя хардкорным путем,

>>> print(len(arr1), len(arr2))
(9258, 263616)

Я используюБлокнот Jupyter с Python 2. Только с использованием numpy, pandas и itertools.

Желаемый результат должен иметь вид;если у меня есть продукты 1,2,3, но я рассматриваю только кортежи (1,) и (2,), тогда мне нужно (1,2), но не (1,3) из всех двух комбинаций продуктов.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Добро пожаловать 2pac ,

Инициализация

>>> arr1 =  np.array([(2421,), (35682,), (30690,),(18622,), (18285,), (31269,)], dtype=object)
>>> arr2 = np.array([(2421, 35682), (2421, 30690), (2421, 24852), (18622, 18285), (18622, 31269), (18285, 31269)], dtype=object)

Так что если вы попытаетесь спросить (2421,), это подмножество arr2 вернет Trueтолько если arr2 содержит кортеж размера 1 и содержит значение 2421.

Поскольку это не ваше ожидаемое поведение, вы должны выполнить итерацию для каждого i элементов arr1 и проверить, являются ли все элементы i[j] частью arr2[k]

Быстрый обзор

>>> arr1[0]
array([2421], dtype=object)
>>> arr1[0] in arr2
True
>>> arr1[0] in arr2[0]
True

Это может дать эту функцию

def is_a_subset( tuple_i, primary_tuple ):
  return all( k in primary_tuple for k in tuple_i)

for tuple_i in arr1:
  is_a_subset( tuple_i , arr2)

Но я посоветую использовать set, если вы строите свою коллекцию пошагово из frozenset, если это неизменная коллекция (то есть set и frozenset )

Edit: Martijn Pieters ответ идет тем же путем

0 голосов
/ 25 октября 2018

Если вы реализуете алгоритм Apriori, вы хотите использовать фактические наборы вместо кортежей.Python имеет два типа наборов: set и frozenset, где последний является неизменным и, следовательно, может храниться в словарях или других наборах.Возможно, вы захотите использовать последнее, чтобы связать такие наборы с оценками поддержки.

Это, безусловно, подход, который используется в apyori реализации проекта ;apyory - это библиотека на чистом Python алгоритма Apriori.

Вы можете выполнять тесты подмножеств с кортежами, но это медленная операция O (NM) для кортежей размеров N и M:

def tuple_is_subset(ta, tb):
    return all(tav in tb for tav in ta)

Это полный цикл над N элементами в ta, и каждый tav in tb тест занимает M = len(tb) шагов.

Вы можете конвертировать кортежи в наборы, но это тоже занимает время O (N) + O (M), после чего проверка подмножества занимает время O (N).Это заставляет целое занимать линейное время, но для небольших наборов я подозреваю, что постоянные затраты на создание новых объектов перевесят теоретический более дорогостоящий тест O (NM) all(), приведенный выше.

Чтобы использовать наборы, выможно использовать:

set(ta).issubset(tb)

, где set.issubset() принимает любую итерацию без набора, код создает объект временного набора для теста.

...