Python中与R中的poly()函数等效的函数是什么?

9
我正在尝试理解如何使用scikit-learn(或其他模块)复制R中的poly()函数。
例如,假设我在R中有一个向量:
a <- c(1:10)

我想生成三次多项式:
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文档中的示例,但仍然感到有点困惑。
非常感谢您的任何见解。谢谢!

这里有一份适用于R(和S-Plus)用户的NumPy速查表。你可能很幸运。 - Laurent LAPORTE
谢谢!我看了一下,但似乎没有我正在寻找的内容(或者我完全错过了)。 - Michelle Tat
你能否提供一下 R 语言中 poly() 函数的描述(规范)? - Laurent LAPORTE
1
https://dev59.com/Q2Ik5IYBdhLWcg3wNru8 解释了 R 中的 poly 函数的作用。 - Ista
你能解释一下你想做什么吗?不用提及R中相应的函数吗? - CentAu
我正在尝试在不同的n次多项式上应用k折交叉验证方法来对广义线性模型进行验证。 - Michelle Tat
2个回答

14

原来可以通过将输入向量 x 的各次幂从 0 次幂(全为1)到 p 次幂排列成矩阵并对其进行 QR 分解,得到的 Q 矩阵减去第一列常数,即可复制 R 的 poly(x,p) 函数的结果。

因此,以下代码应该可行:

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

非常有用。感谢大家的帮助! - Michelle Tat
这真的很有用。你知道如何将这种转换应用于未在拟合中使用的新数据,就像在这个答案中所做的那样吗?我们如何从转换中获得系数? - zola25
我也很好奇之后我们如何能够获得系数。 - PascalVKooten
我只是想添加这个评论来表达感谢,当然我已经点赞了!! - StatguyUser

3
K. A. Buhr的回答非常全面。
R的poly函数还可以计算成员不同阶数的交互作用。这就是我在寻找R poly等效函数的原因。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.]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接