查找特征的所有组合

Find all combinations of features

我需要将我的二进制编码特征矩阵转换成一个由所有可能的特征交互组合组成的矩阵。我的意思是所有组合(每组 2 个,每组 3 个,每组 4 个,每组全部,等等)。

有人知道是否有办法用 sklearn.preprocessing 做到这一点吗?还是其他图书馆?

将此数组输入到某个函数或方法中:

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

并将其作为输出

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

新矩阵中的每一行代表[x1*x2, x1*x3, x2*x3, x1*x2*x3]

你想要的就是powerset. So you want to find the powerset of your features and then multiply the corresponding binary values, which is basically taking a np.bitwise_and。那么您可以这样做:

  • 获取幂集,找到最大长度为 len(features)
  • 的所有特征组合
  • 减少 np.logical_and.reduce
  • 追加到包含 powerset
  • 中所有 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]])

更新:好的,一个 for 循环消失了,一个继续。

recipes section of itertools:

中有一个很好的 powerset 函数
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))