You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 04:55:33