R具有3个参数的目标搜寻

时间:2018-09-02 16:07:43

标签: r optimization

#========
#DATABASE
#========
database <- matrix(c(51,43,-22,-92,28,-21,68,22,9,-20,-30,-1,-10,10,-10,-5,10,-2,30,-3,-5),ncol=3,byrow=TRUE)
colnames(database ) <- c("A","B","C")
database  <- as.data.frame(database )
x<-1
y<-1
z<-1
database$RES<-c(1,0,0,0,1,0,1)
database$SCORE<- database$A*x+database$B*y+database$C*z
database$PREV<- ifelse(database$SCORE>1,1,0)

#========
#TARGET
#========
t<-table(database$RES, database$PREV)
P<-(t[1]+t[4])/nrow(database)

这是我的数据库的一个示例(60k行),我想找到xyz的值(在代码中我放了“ 1”只是为了方便运行脚本,但我想找到它们!)具有最大值P。目标P必须为1或接近于1。

我没有在类似标题的线程中找到所需的内容。 在excel中非常简单,但是找不到多个参数。

先感谢

1 个答案:

答案 0 :(得分:1)

我对这个答案不满意,但这也许至少可以帮助您入门。

optim()函数可以找到您要解决的问题的最佳答案,但是对我来说,至少从玩具数据来看,它发现自己处于局部最大值。您必须运行几次才能找到最佳参数,对我来说,它发生在P = 0.8571429时,甚至xyz的值也会变化非常重要,这表明针对此特定数据有几种同样最优的解决方案。

database <- matrix(c(51,43,-22,-92,28,-21,68,22,9,-20,-30,-1,-10,10,-10,-5,10,-2,30,-3,-5),ncol=3,byrow=TRUE)
colnames(database ) <- c("A","B","C")
database  <- as.data.frame(database )
database$RES <- c(1,0,0,0,1,0,1)

find_best <- function(data, x) {
  SCORE <- data$A*x[1]+data$B*x[2]+data$C*x[3]
  PREV <- ifelse(SCORE>1,1,0)
  t <- table(data$RES, PREV)
  P <- (t[1]+t[4])/nrow(data)
  P
}

result <- optim(c(1, 1, 1), find_best, data = database, method = "SANN", control = list(fnscale = -1))

result$value
[1] 0.8571429 # The P value

result$par
[1]  2.396844 -4.460343 -7.137460 # These are your sought after x, y, z parameters.