我需要将我的二进制编码特征矩阵转换为包含所有可能特征交互组合的矩阵。我的意思是字面上所有组合(每组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]
回答:
你想要的是所谓的幂集。所以你需要找到特征的幂集,然后乘以对应的二进制值,这基本上是使用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, combinationsfeatures = 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).Tarray([[0, 0, 1, 0], [0, 0, 0, 0], [1, 1, 1, 1]])