R中的多项式展开

问题描述 投票:-1回答:1

我目前正在查看SO的问题,发现OP指出,通过添加更多的for循环,您可以扩展多项式。您究竟将如何做?我正在尝试扩展到多阶5。

Polynomial feature expansion in R

这是下面的代码:

polyexp = function(df){
  df.polyexp = df
  colnames = colnames(df)
  for (i in 1:ncol(df)){
    for (j in i:ncol(df)){
      colnames = c(colnames, paste0(names(df)[i],'.',names(df)[j]))
      df.polyexp = cbind(df.polyexp, df[,i]*df[,j])
    }
  }
  names(df.polyexp) = colnames
  return(df.polyexp)
}

最终,我想对进行排序,以使其按度数顺序扩展。我尝试使用poly函数,但不确定是否可以对结果进行排序,以使其返回以度1开头的,然后移至度2,然后是3、4和5。

r matrix polynomials
1个回答
2
投票

“按等级排序”有点含糊。 x^2x*y都具有2度。我假设您要按总度数排序,然后在每个值中按第一列的度数排序;在此范围内,按第二列的度数,依此类推。(我相信默认值是忽略总的度数,并按最后一列的度数对排序,在倒数第二列之内,依此类推,依此类推,但未记录在案,因此我不会不能指望。)

这里是使用polym的方法。这些列的名称类似"2.0""1.1"。您可以按字母顺序对它们进行排序,最高可达9级,但是如果使用as.numeric_version转换这些名称,则没有限制。因此,将列名称转换为版本名称,获取排序顺序,然后使用该加号对结果的列进行重新排序。例如,

df <- data.frame(x = 1:6, y = 0:5, z = -(1:6))

expanded <- polym(as.matrix(df), degree = 5)

o <- order(attr(expanded, "degree"),
           as.numeric_version(colnames(expanded)))

sorted <- expanded[,o]
# That lost the attributes, so put them back
attr(sorted, "degree") <- attr(expanded, "degree")[o]
attr(sorted, "coefs") <- attr(expanded, "coefs")
class(sorted) <- class(expanded)

# If you call predict(), it comes out in the default order,
# so will need sorting too:

predict(sorted, newdata = as.matrix(df[1,]))[, o]
#>       0.0.1       0.1.0       1.0.0       0.0.2       0.1.1       0.2.0 
#>  0.59761430 -0.59761430 -0.59761430  0.54554473 -0.35714286  0.54554473 
#>       1.0.1       1.1.0       2.0.0       0.0.3       0.1.2       0.2.1 
#> -0.35714286  0.35714286  0.54554473  0.37267800 -0.32602533  0.32602533 
#>       0.3.0       1.0.2       1.1.1       1.2.0       2.0.1       2.1.0 
#> -0.37267800 -0.32602533  0.21343368 -0.32602533  0.32602533 -0.32602533 
#>       3.0.0       0.0.4       0.1.3       0.2.2       0.3.1       0.4.0 
#> -0.37267800  0.18898224 -0.22271770  0.29761905 -0.22271770  0.18898224 
#>       1.0.3       1.1.2       1.2.1       1.3.0       2.0.2       2.1.1 
#> -0.22271770  0.19483740 -0.19483740  0.22271770  0.29761905 -0.19483740 
#>       2.2.0       3.0.1       3.1.0       4.0.0       0.0.5       0.1.4 
#>  0.29761905 -0.22271770  0.22271770  0.18898224  0.06299408 -0.11293849 
#>       0.2.3       0.3.2       0.4.1       0.5.0       1.0.4       1.1.3 
#>  0.20331252 -0.20331252  0.11293849 -0.06299408 -0.11293849  0.13309928 
#>       1.2.2       1.3.1       1.4.0       2.0.3       2.1.2       2.2.1 
#> -0.17786140  0.13309928 -0.11293849  0.20331252 -0.17786140  0.17786140 
#>       2.3.0       3.0.2       3.1.1       3.2.0       4.0.1       4.1.0 
#> -0.20331252 -0.20331252  0.13309928 -0.20331252  0.11293849 -0.11293849 
#>       5.0.0 
#> -0.06299408

reprex package(v0.3.0)在2020-03-21创建

© www.soinside.com 2019 - 2024. All rights reserved.