如何调整R中多项式矩阵输出顺序以匹配Python?
调整R中poly函数输出顺序以匹配Python的PolynomialFeatures
问题说明
我使用Python的PolynomialFeatures和R的poly函数生成三次多项式矩阵,两者包含的数值完全一致,但输出顺序不同。示例数据为x = [2,3,4,5,6],需要调整R的输出顺序,使其与Python的结果完全对齐。
Python代码与输出
import numpy as np from sklearn.preprocessing import PolynomialFeatures X = np.vstack([2,3,4,5,6]).T poly = PolynomialFeatures(degree=3) X_ = poly.fit_transform(X)
Python输出:
array([[ 1., 2., 3., 4., 5., 6., 4., 6., 8., 10., 12., 9., 12., 15., 18., 16., 20., 24., 25., 30., 36., 8., 12., 16., 20., 24., 18., 24., 30., 36., 32., 40., 48., 50., 60., 72., 27., 36., 45., 54., 48., 60., 72., 75., 90., 108., 64., 80., 96., 100., 120., 144., 125., 150., 180., 216.]])
R原代码与输出
x <- t(c(2, 3, 4, 5, 6)) dx <- c(1, as.numeric(poly(x, degree = 3, raw=TRUE)))
R输出:
[1] 1 2 4 8 3 6 12 9 18 27 4 8 16 12 [15] 24 36 16 32 48 64 5 10 20 15 30 45 20 40 [29] 60 80 25 50 75 100 125 6 12 24 18 36 54 24 [43] 48 72 96 30 60 90 120 150 36 72 108 144 180 216
解决方案
两者顺序差异的核心原因:
- Python的
PolynomialFeatures默认按总次数升序,同次数下按变量索引升序生成特征(列主序展开) - R的
poly(raw=TRUE)按单个变量的次数升序生成特征(行主序展开)
以下两种方法可实现顺序对齐:
方法一:手动构造多项式特征(直观易理解)
直接按照Python的特征顺序手动生成各阶项,适合变量数量少的场景:
x <- c(2, 3, 4, 5, 6) # 拆分单个变量 x1 <- x[1]; x2 <- x[2]; x3 <- x[3]; x4 <- x[4]; x5 <- x[5] # 构造各阶特征 const <- 1 # 常数项 linear <- c(x1, x2, x3, x4, x5) # 一次项 quadratic <- c(x1^2, x1*x2, x1*x3, x1*x4, x1*x5, x2^2, x2*x3, x2*x4, x2*x5, x3^2, x3*x4, x3*x5, x4^2, x4*x5, x5^2) # 二次项(同次数下按变量索引升序) cubic <- c(x1^3, x1^2*x2, x1^2*x3, x1^2*x4, x1^2*x5, x1*x2^2, x1*x2*x3, x1*x2*x4, x1*x2*x5, x1*x3^2, x1*x3*x4, x1*x3*x5, x1*x4^2, x1*x4*x5, x1*x5^2, x2^3, x2^2*x3, x2^2*x4, x2^2*x5, x2*x3^2, x2*x3*x4, x2*x3*x5, x2*x4^2, x2*x4*x5, x2*x5^2, x3^3, x3^2*x4, x3^2*x5, x3*x4^2, x3*x4*x5, x3*x5^2, x4^3, x4^2*x5, x4*x5^2, x5^3) # 三次项(同次数下按变量索引升序) # 合并所有特征 X_ <- c(const, linear, quadratic, cubic)
运行后X_的输出顺序将与Python完全一致:
[1] 1 2 3 4 5 6 4 6 8 10 12 9 12 15 18 16 20 24 25 30 36 8 12 16 20 24 18 24 30 36 32 40 48 50 60 72 27 36 45 54 48 60 72 75 90 108 64 80 96 100 120 144 125 150 180 216
方法二:自动排序poly输出(灵活适配多变量)
通过生成多项式项的指数组合,按照Python的规则排序后重新计算特征值,适合变量数量较多的场景:
library(combinat) x <- t(c(2, 3, 4, 5, 6)) degree <- 3 n_vars <- ncol(x) # 生成符合Python顺序的指数组合 get_exponents <- function(n_vars, max_degree) { # 生成所有可能的指数组合(变量数×次数) all_exps <- expand.grid(rep(list(0:max_degree), n_vars)) %>% apply(1, function(row) sum(row) <= max_degree) %>% which() %>% {expand.grid(rep(list(0:max_degree), n_vars))[., ]} # 按总次数升序,同次数下按变量索引升序排序 sorted_exps <- all_exps[order(rowSums(all_exps), apply(all_exps, 1, paste, collapse="")), ] return(sorted_exps) } # 获取排序后的指数组合 sorted_exponents <- get_exponents(n_vars, degree) # 计算每个多项式项的值 poly_features <- apply(sorted_exponents, 1, function(exp) prod(x^exp)) # 转换为向量格式 X_ <- as.numeric(poly_features)
此方法自动生成并排序所有多项式项,无需手动构造,输出顺序与Python完全匹配。
内容的提问来源于stack exchange,提问作者Globoquadrina
相关产品推荐
相关产品推荐

