Python: 创建一个n次多项式
我有一组特征
[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 个回答
借鉴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))])
你可以使用 itertools.product
来生成从原始集合中选择的 n 个值的所有可能组合;不过要注意,这样会生成 (x2, x1)
和 (x1, x2)
这两种情况。
同样,itertools.combinations
会生成没有重复和不改变顺序的组合,这样的话你就不会得到 (x1, x1)
这样的组合。
你到底想做什么呢?你需要这些结果值来干嘛?你确定真的想要那些 x1^2
这样的项吗(同一个特征出现多次是什么意思)?在这个上下文中,“特征”到底指的是什么呢?
使用
itertools.combinations(list, r)
这里的 list
是特征集合,r 是你想要的多项式特征的阶数。然后将上面提到的子列表中的元素相乘。这样你就能得到 {x1*x2, x1*x3, ...}
。你还需要构造其他的组合,然后把所有部分合并在一起。
[编辑]
更好的方法是使用 itertools.combinations_with_replacement(list, r)
,这样可以很方便地得到允许重复元素的长度为 r 的有序元组。