Python:创建n次多项式

时间:2011-12-21 21:46:51

标签: python algorithm

我有一个功能集

[x1,x2....xm]

现在我想创建多项式特征集 这意味着如果学位是2,那么我有功能集

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

所以它只包含2阶的条款.. 同样是如果订单是三个......那么你也会有立方术语。

怎么做?

编辑1:我正在开发一个机器学习项目,我有近7个功能......对这个线性特征的非线性回归给出了正确的结果...因此我认为要获得更多的数字我可以将这些功能映射到更高的维度.. 所以一种方法是考虑特征向量的多项式阶数...... 生成x1 * x1也很容易.. :)但是获得其余的组合有点棘手......

如果订单是3,组合可以给我x1x2x3结果吗?

3 个答案:

答案 0 :(得分:4)

使用

itertools.combinations(list, r)

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

[编辑] 更好:itertools.combinations_with_replacement(list, r)将很好地给出带有重复元素的已排序长度-r元组。

答案 1 :(得分:3)

您可以使用itertools.product创建从原始集合中选择的所有可能的n个值集合;但请注意,这会生成(x2, x1)以及(x1, x2)

同样地,itertools.combinations将生成集合而不重复或重新排序,但这意味着您不会获得(x1, x1)

你到底想要做什么?你需要这些结果值是什么?您确定要确实需要这些x1^2类型的术语(多次使用相同的功能意味着什么)?究竟什么是这个背景下的“特征”?

答案 2 :(得分: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))])