Python:创建一个n次多项式

5
我有一组功能集
[x1,x2....xm]

现在我想创建多项式特征集

这意味着如果度为2,则我的特征集为

[x1.... xm,x1^2,x2^2...xm^2, x1x2, x1x3....x1,xm......xm-1x1....xm-1xm]

因此,它只包含二次项的术语... 如果阶数为三,则也会有立方项...

如何做到这一点?

编辑1:我正在进行一个机器学习项目,在这个线性特征上进行非线性回归得到了不错的结果...因此,我想通过将这些特征映射到更高的维度来获得更多的特征数量... 因此,一种方法是考虑特征向量的多项式阶数... 生成x1*x1很容易... :) 但是获取其余组合有点棘手...

如果阶数为3,组合能给我x1x2x3的结果吗?

3个回答

5

使用

itertools.combinations(list, r)

其中list是特征集合,r是所需多项式特征的阶数。然后乘以上述给定的子列表的元素。这应该会给你{x1 * x2,x1 * x3,...}。您需要构建其他的,然后合并所有部分。

[编辑] 更好的方法:itertools.combinations_with_replacement(list, r)将很好地生成允许重复元素的已排序长度为r的元组。


1
itertools.combinations(firstOrderFeatures, 3) 可以给你所有三个一阶特征的唯一组合。它将包含 {x1, x2, x3},但不包括其他5个排列组合。 - DataComputist
2
这不应该是itertools.combinations_with_replacement吗?2阶特征是x1^2,x1x2,x2^2而不是(像组合会给你的那样)只有x1x2。 - user97370
你是对的。itertools.combinations_with_replacement(list, r) 可以很好地生成允许重复元素的排序长度为r的元组。 - DataComputist

3
您可以使用 itertools.product 来创建从原始集合中选择的 n 个值的所有可能集合;但请记住,这将生成 (x2, x1)(x1, x2)
同样地,itertools.combinations 将生成没有重复或重新排序的集合,但这意味着您不会得到例如 (x1, x1)
您究竟想做什么?您需要这些结果值做什么?您确定要那些 x1^2 类型的术语吗(在同一特征上出现多次是什么意思)?在这种情况下,“特征” 到底是什么?

0

借鉴Karl的答案,尝试使用product函数并利用set对象。类似这样:

set([set(comb) for comb in itertools.product(range(5),range(5)])

这将消除重复的对。然后,您可以将集合转换回列表并按照您的意愿进行排序或迭代。

编辑: 实际上,这将消除x_m^2项,因此建立排序的元组而不是集合。这将使术语可哈希且不重复。

set([tuple(sorted(comb)) for comb in itertools.product(range(5),range(5))])

你不能将集合放入集合中。你必须使用frozensets,这样它们才能被哈希。 - John La Rooy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接