2017-03-08 2 views
0

tout d'abord, s'excuser pour le titre peu énigmatique à ma question. Laissez-moi essayer d'expliquer mon besoin: - Je lis deux fonctionnalités à savoir X1, X2 à partir d'un fichier CSV. J'ai un jeu de données d'apprentissage dans un fichier csv contenant 1000 enregistrements avec chaque ligne correspondant à la valeur de X1, X2. Pour que mon ensemble d'apprentissage corresponde mieux à mon code d'apprentissage automatique, je veux faire un mappage d'entités qui prend X1, X2 et crée des termes polynomiaux à la puissance de 4. par exemple si X1 = a, X2 = b, je veux ajouter les plus récents comportent un^2, un * b, b^2, un^3, un^2 * b, un * b^2, un^4 ... et ainsi de suite. Maintenant, si je les lis comme une matrice numpy, je veux voir les données comme ceci:ajouter des colonnes à une matrice numpy basée sur le degré de polynôme

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

Notez que le nombre de lignes sont fixes, mais le nombre de colonnes sont déterminées par le degré sélectionné. En outre trois premières colonnes doivent être

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

Le pseudo-code Je pense est la suivante: -

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) 

Je ne sais pas comment obtenir ce travail en python ?. apprécierait une suggestion. Notez que^fait référence à la puissance de.

Répondre

0

A partir de deux vecteurs X1 et X2 vous pouvez créer les monômes:

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

puis les combiner à l'aide mgrid

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

vous pourriez aussi appliquer les indices directement à X1 et X2:

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

Cela nécessite moins de lignes de code mais utilise plus de multiplications.

Si le nombre de multiplications est un problème, X1p et X2p pourraient également être calculés moins cher; 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:]) 

et similaire pour X2p

+0

merci Paul. cela expose ma faiblesse en numpy. laissez-moi essayer cela et revenir à vous. j'apprécie. – sunny

+0

merci, ça a marché. vous m'avez également exposé à np.mgrid.that est utile. – sunny