2016-12-24 7 views
3

J'essaie de comprendre comment répliquer la fonction poly() dans R en utilisant scikit-learn (ou un autre module).Python équivalent à la fonction poly() R?

Par exemple, disons que j'ai un vecteur dans R:

a <- c(1:10) 

Je veux générer polynôme du 3ème degré:

polynomial <- poly(a, 3) 

Je reçois le texte suivant:

   1   2   3 
[1,] -0.49543369 0.52223297 -0.4534252 
[2,] -0.38533732 0.17407766 0.1511417 
[3,] -0.27524094 -0.08703883 0.3778543 
[4,] -0.16514456 -0.26111648 0.3346710 
[5,] -0.05504819 -0.34815531 0.1295501 
[6,] 0.05504819 -0.34815531 -0.1295501 
[7,] 0.16514456 -0.26111648 -0.3346710 
[8,] 0.27524094 -0.08703883 -0.3778543 
[9,] 0.38533732 0.17407766 -0.1511417 
[10,] 0.49543369 0.52223297 0.4534252 

Je suis relativement nouveau sur python et j'essaie de comprendre comment utiliser la fonction PolynomiaFeatures dans sklearn pour reproduire cela. J'ai passé du temps à regarder des exemples à la documentation PolynomialFeatures mais je suis encore un peu confus.

Toute idée serait grandement appréciée. Merci!

+0

Il y a un [NumPy pour les utilisateurs R (et S-Plus)] (http://mathesaurus.sourceforge.net/ r-numpy.html) feuille de triche. Tu peux avoir de la chance. –

+0

Merci! Je l'ai regardé mais il ne semble pas avoir ce que je cherche (ou je le manque complètement). –

+0

Pourriez-vous donner une description (spécification) de la fonction R 'poly()'? –

Répondre

3

Il se avère que vous pouvez reproduire le résultat de la fonction de R poly(x,p) en effectuant une décomposition QR d'une matrice dont les colonnes sont les pouvoirs du vecteur d'entrée x de la puissance 0e (tous ceux) jusqu'à la p e puissance. La matrice Q, moins la première colonne constante, vous donne le résultat que vous voulez.

Donc, ce qui suit devrait fonctionner:

import numpy as np 

def poly(x, p): 
    x = np.array(x) 
    X = np.transpose(np.vstack((x**k for k in range(p+1)))) 
    return np.linalg.qr(X)[0][:,1:] 

En particulier:

In [29]: poly([1,2,3,4,5,6,7,8,9,10], 3) 
Out[29]: 
array([[-0.49543369, 0.52223297, 0.45342519], 
     [-0.38533732, 0.17407766, -0.15114173], 
     [-0.27524094, -0.08703883, -0.37785433], 
     [-0.16514456, -0.26111648, -0.33467098], 
     [-0.05504819, -0.34815531, -0.12955006], 
     [ 0.05504819, -0.34815531, 0.12955006], 
     [ 0.16514456, -0.26111648, 0.33467098], 
     [ 0.27524094, -0.08703883, 0.37785433], 
     [ 0.38533732, 0.17407766, 0.15114173], 
     [ 0.49543369, 0.52223297, -0.45342519]]) 

In [30]: 
+0

Très utile. Merci à tous pour votre aide! –

0

La réponse est par K. A. Buhr pleine et entière.

La fonction R poly calcule également des interactions de différents degrés des membres. C'est pourquoi je cherchais l'équivalent polyéthylène.
sklearn.preprocessing.PolynomialFeatures Semble fournir tel, vous pouvez faire l'étape np.linalg.qr(X)[0][:,1:] après pour obtenir la matrice orthogonale.

Quelque chose comme ceci:

import numpy as np 
import pprint 
import sklearn.preprocessing 
PP = pprint.PrettyPrinter(indent=4) 

MATRIX = np.array([[ 4, 2],[ 2, 3],[ 7, 4]]) 
poly = sklearn.preprocessing.PolynomialFeatures(2) 
PP.pprint(MATRIX) 
X = poly.fit_transform(MATRIX) 
PP.pprint(X) 

Résultats dans:

array([[4, 2], 
     [2, 3], 
     [7, 4]]) 
array([[ 1., 4., 2., 16., 8., 4.], 
     [ 1., 2., 3., 4., 6., 9.], 
     [ 1., 7., 4., 49., 28., 16.]])