首先,为我的问题道歉。让我试着解释一下我的需要: - 我正在从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中使用它?会很感激一些建议。请注意,^指的是。的权力。
答案 0 :(得分:0)
从两个向量X1
和X2
开始,您可以创建单项式:
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]]
或者,您可以将索引直接应用于X1
和X2
:
result = X1[:, None]**i[m] * X2[:, None]**j[m]
这需要更少的代码行,但使用更多的乘法。
如果考虑乘法次数,X1p
和X2p
也可以更便宜地计算; 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