Python: 创建一个n次多项式

5 投票
3 回答
3046 浏览
提问于 2025-04-17 08:49

我有一组特征

[x1,x2....xm]

现在我想创建一个多项式特征集。这是什么意思呢?如果我的次数是二,那么我就会有这组特征

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

所以它只包含二次项。如果次数是三,那就会有三次项了……

我该怎么做呢?

补充说明1:我正在做一个机器学习项目,手头大约有7个特征……用这些线性特征做非线性回归的结果还不错……所以我想通过将这些特征映射到更高的维度来增加特征的数量。

一种方法就是考虑特征向量的多项式次数……生成x1*x1是简单的……但获取其他组合就有点棘手了……

如果次数是3,组合能给我x1x2x3的结果吗?

3 个回答

0

借鉴Karl的回答,试着使用乘积,然后利用集合对象。可以这样做:

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))])
3

你可以使用 itertools.product 来生成从原始集合中选择的 n 个值的所有可能组合;不过要注意,这样会生成 (x2, x1)(x1, x2) 这两种情况。

同样,itertools.combinations 会生成没有重复和不改变顺序的组合,这样的话你就不会得到 (x1, x1) 这样的组合。

你到底想做什么呢?你需要这些结果值来干嘛?你确定真的想要那些 x1^2 这样的项吗(同一个特征出现多次是什么意思)?在这个上下文中,“特征”到底指的是什么呢?

5

使用

itertools.combinations(list, r)

这里的 list 是特征集合,r 是你想要的多项式特征的阶数。然后将上面提到的子列表中的元素相乘。这样你就能得到 {x1*x2, x1*x3, ...}。你还需要构造其他的组合,然后把所有部分合并在一起。

[编辑] 更好的方法是使用 itertools.combinations_with_replacement(list, r),这样可以很方便地得到允许重复元素的长度为 r 的有序元组。

撰写回答