Найти все комбинации функций - PullRequest
2 голосов
/ 13 апреля 2020

Мне нужно преобразовать мою двоично-кодированную матрицу объектов в матрицу, состоящую из всех возможных комбинаций взаимодействий объектов. Под всеми я подразумеваю буквально все комбинации (каждый набор 2, каждый набор 3, каждый набор 4, каждый набор всех, и т. Д. c).

Кто-нибудь знает, есть ли способ сделать это со склеарн.процессинг? Или другие библиотеки?

Введите этот массив в некоторую функцию или метод:

array([[0, 1, 1],
       [1, 0, 0],
       [1, 1, 1]])

И получите это как Output

array([[0, 0, 1, 0],
       [0, 0, 0, 0],
       [1, 1, 1, 1]])

Каждая строка в новой матрице представляет [ x1 * x2, x1 * x3, x2 * x3, x1 * x2 * x3]

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

То, что вы хотите, известно как powerset . Таким образом, вы хотите найти набор функций ваших функций, а затем умножить соответствующие двоичные значения, которые в основном принимают np.bitwise_and. Вот как вы могли бы сделать это:

  • Получите блок питания, найдя все комбинации функций вплоть до длины len(features)
  • Уменьшите с помощью np.logical_and.reduce
  • Добавить в список, содержащий все sets в блоке питания

a = np.array([[0, 1, 1],
              [1, 0, 0],
              [1, 1, 1]])

from itertools import chain, combinations

features = a.T.tolist()
power_set = []
for comb in chain.from_iterable(combinations(features, r) 
                               for r in range(2,len(features)+1)):
    power_set.append(np.logical_and.reduce(comb).view('i1').tolist())

, который даст вам:

np.array(power_set).T

array([[0, 0, 1, 0],
       [0, 0, 0, 0],
       [1, 1, 1, 1]])
0 голосов
/ 13 апреля 2020

Обновление: Хорошо, один для l oop ушел, один для go.

В разделе рецептов itertools есть хорошая функция :

def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

Это должно работать. Это еще не оптимизировано для скорости. Вложенные циклы for, вероятно, могут быть удалены, если это обеспечивает результат, который вы ищете.

import numpy as np
from itertools import combinations, chain

features = np.array([[0, 1, 1],
                     [1, 0, 0],
                     [1, 1, 1]])

n = features.shape[1]

def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

# get all combinations, we will use this as indices for the columns later
indices = list(powerset(range(n)))

# remove the empty subset
indices.pop(0)

print(indices)

data = []

for i in indices:

    print()
    print(i)
    _ = features[:, i]
    print(_)

    x = np.prod(_, axis=1)
    print(x)
    data.append(x)

print(np.column_stack(data))
...