2016-12-24 67 views
3

我想了解如何使用scikit-learn(或其他模塊)在R中複製poly()函數。相當於R poly()函數的Python?

例如,假設我有R中的向量:

a <- c(1:10) 

我想生成第3次多項式:

polynomial <- poly(a, 3) 

我得到如下:

   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 

我對python比較陌生,我想知道如何利用sklearn中的PolynomiaFeatures函數複製這個。我花了一些時間在PolynomialFeatures文檔上看例子,但我仍然有點困惑。

任何有識之士將不勝感激。謝謝!

+0

有一個[NumPy的爲R(和S-PLUS)用戶(http://mathesaurus.sourceforge.net/ r-numpy.html)備忘單。你可以很幸運。 –

+0

謝謝!我看了一下,但它似乎沒有我正在尋找的東西(或者我完全錯過了它)。 –

+0

你能給一個R'poly()'函數的描述(規範)嗎? –

回答

3

事實證明,可以通過執行它的列是輸入矢量x的從第0功率(全1)的上電至所述p次方的矩陣進行QR分解,複製的r poly(x,p)函數的結果。 Q矩陣,減去第一個常數列,給出你想要的結果。

因此,下面應該工作:

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:] 

特別是:

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

非常有幫助。感謝所有的幫助! –

0

通過K. A. Buhr答案是全面和完整。

R多邊形函數還計算不同程度的成員之間的相互作用。這就是爲什麼我正在尋找R聚等價物。
sklearn.preprocessing.PolynomialFeatures似乎提供這樣的,你可以做np.linalg.qr(X)[0][:,1:]步之後得到正交矩陣。

像這樣:

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) 

結果:

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.]])