根据多项式的次数将列添加到numpy矩阵

时间:2017-03-08 02:09:25

标签: python-3.x numpy matrix

首先,为我的问题道歉。让我试着解释一下我的需要: - 我正在从CSV文件中读取两个功能,即X1,X2。我在csv文件中有一组训练数据,其中包含1000条记录,每条线对应X1​​,X2的值。为了使我的训练集更适合我的机器学习代码,我想做一个特征映射,它将X1,X2和多项式项创建为4的幂。例如,如果X1 = a,X2 = b,我想添加较新的特征a ^ 2,a * b,b ^ 2,a ^ 3,a ^ 2 * b,a * b ^ 2,a ^ 4 ...等等。 现在如果我把它们看成是一个numpy矩阵,我想看到这样的数据:

[ [ 1 a b a^2 a*b, b^2 a^3  a^2*b......]
  [....  ............   ............   ]
  [ ..
                                   ..] ]

请注意,行数是固定的,但列数由所选的程度决定。前三列也需要

  [[1 a b ..]
  [1 c d ..]
  ..
  ..]

我想到的伪代码如下: -

 def poly(X): # where X is a numpy matrix with X1, X2 columns,
   degree = 4;
   r= X.shape[0]
   c=1 # number of columns

   val_matrix= np.ones(shape=(r,c)) # creating a (r,1) matrix init with 1s
   # *start of psuedo code*
   while i<=degree:
      while j <=i:
         val_matrix[:, c+1] = (X1.^(i-j)).*(X2.^j)

我不确定如何在python中使用它?会很感激一些建议。请注意,^指的是。的权力。

1 个答案:

答案 0 :(得分:0)

从两个向量X1X2开始,您可以创建单项式:

X1p = X1[:, None]**np.arange(max_deg + 1)
X2p = X2[:, None]**np.arange(max_deg + 1)

然后使用mgrid

组合它们
i, j = np.mgrid[:max_deg + 1,:max_deg + 1]
m = i+j <= max_deg
result = X1p[:, i[m]]*X2p[:, j[m]]

或者,您可以将索引直接应用于X1X2

result = X1[:, None]**i[m] * X2[:, None]**j[m]

这需要更少的代码行,但使用更多的乘法。

如果考虑乘法次数,X1pX2p也可以更便宜地计算; X1p

X1p = np.empty((len(X1), max_deg + 1), X1.dtype)
X1p[:, 0] = 1
X1p[:, 1:] = X1[:, None]
np.multiply.accumulate(X1p[:,1:], axis=-1, out=X1p[:, 1:])

X2p

类似