2017-03-08 59 views
0

首先,爲我的問題的小祕密標題道歉。讓我試着解釋我的需求: - 我正在從CSV文件中讀取兩個功能,即X1,X2。我在包含1000條記錄的csv文件中有一組訓練數據,每行對應於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的矩陣,我希望看到這樣的數據:首先根據多項式的程度將列添加到一個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) 

我不知道如何讓蟒蛇這個工作?會感激一些建議。請注意^指的是權力。

回答

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

+0

感謝保羅類似。這暴露了我的弱點在numpy。讓我試試看,回到你身邊。欣賞它。 – sunny

+0

謝謝,它工作。你也暴露給我np.mgrid.that是有幫助的。 – sunny