【问题标题】:Combinatorial Optimization in RR中的组合优化
【发布时间】:2016-11-14 20:40:10
【问题描述】:

我的数据集示例如下所示:

df = data.frame(cbind(a = c(1,3,5), b = c(4,1,7), c = c(1,9,10)))
y = c(8, 9, 20)

我想找出 a、b 和 c 的最佳组合,使所选列的总和与 y 之间的相关性最大化。

例如,找出所有这些组合中最强的相关性:

cor(df$a, y)
cor(df$b, y)
cor(df$c, y)
cor(df$a+df$b, y)
cor(df$a+df$c, y)
cor(df$b+df$c, y)
cor(df$a+df$b+df$c, y)

我目前的方法是:

combination = list()
for(i in 1:3){combination[[i]]=c(NA,1)}
names(combination) = c("a", "b", "c") 
combi = arrange(expand.grid(combination), a)

combi = mutate(combi, cor = NA)

for (i in 1:2^3){
  x = as.numeric(combi[i,])
  col = x*c(1:3)
  col = col[!is.na(col)]

  if(length(col)>1){
     t = rowSums(df[, col])
     combi[i, 4] = cor(t,y)
  }

  if(length(col)==1){
     t = df[, col]
     combi[i, 4] = cor(t,y)
  }

  if(length(col)==0){
     combi[i, 4] = NA
  }

}

是否有评估所有可能组合的简单方法?当列的总数增加时,找到所有组合变得非常痛苦。我应该在这里使用什么样的策略来在有限的步骤内找到最佳组合(只是局部优化)?向前/向后逐步选择怎么样?

在这种情况下没有模型。通过说向前/向后逐步选择,我的意思是一种类似于人们对回归模型所做的方法: 不要一次搜索所有可能的列组合,而是从每一列单独开始,然后找到具有最强相关性的列。然后,仅考虑包含此列的组合。

非常感谢您的任何建议!

【问题讨论】:

  • 你不能在 Stack Overflow 上索要包。 “要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是题外话,因为它们往往会吸引固执己见的答案和垃圾邮件。”
  • 我不确定您所说的“前进/后退/逐步选择”是什么意思。您可以使用,例如,MASS::stepAIC 进行线性模型选择,但这将是线性组合,没有您所有系数都为 1 的约束。
  • 我认为这里的关键问题不是找到所有组合,而是在有限的步骤中有效评估所有组合的策略。

标签: r optimization selection combinations


【解决方案1】:

我不知道周围是否有包可以进行整个评估,但是使用 combn 可以更有效地循环所有可能的情况:

# basic data
df = data.frame(cbind(a = c(1,3,5), b = c(4,1,7), c = c(1,9,10)))
y = c(8, 9, 20)

# do single correlations first, since the following code with apply refuses single columns
cors<-data.frame(m=NA,cc=NA)  # define cors to collect results

for (i in 1:ncol(df)){
  cors[i,1]<-1
  cors[i,2]<-cor(df[,i],y)
}

# the following code uses combn to find all combinations and perform a function on them, with correlations as result. These are stored in cors

for (m in 2:ncol(df)){
  cv<-combn(ncol(df),m,FUN=function(x) cor(apply(df[,x],1,sum),y))
  cors[(i+1):(i+length(cv)),2]<-cv
  cors[(i+1):(i+length(cv)),1]<-m
  i<-i+length(cv)
}

print(cors)

产量:

  m        cc
1 1 0.9011271
2 1 0.8260332
3 1 0.6444459
4 2 0.9819805
5 2 0.7317957
6 2 0.9385110
7 3 0.9299975

其中 m 为您提供组合的列数,以及 cc 相关性。通过一些改进,您还可以将组合的组成保留在同一数据帧中,但您也可以先选择最大值,然后找出产生最大值的组合(在这种情况下,第一个值 m= 2,即combn(ncol(df),m)[,1])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-20
    • 2016-07-07
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 2015-03-07
    • 2022-11-18
    • 1970-01-01
    相关资源
    最近更新 更多