【问题标题】:Trying to optimize a function written in for loop using optim function尝试使用 optim 函数优化在 for 循环中编写的函数
【发布时间】:2019-08-06 11:12:09
【问题描述】:

我已经使用 for 循环模拟了 holtwinter 函数,现在我正在尝试优化 alpha、beta、gamma 的值。但是当我运行 optim 函数时,它返回的值与我作为起点传递的值相同。我是 R 的新手,所以寻求帮助。

我将提供我编写的代码和我正在使用的数据表。

我已经按照给定的格式尝试了优化,但无法得到想要的结果

sol3<-function(par){
  bal_data<- read.csv("C:/Gitaish_bkp/gitaish/Oracle/ittemar/kpmg docs/hw/bal_data.csv", header=TRUE,sep=",",stringsAsFactors =FALSE)
  final_trend<-data.frame(u= numeric(0))
  #alpha<-par[1]
  #beta<-par[2]
  #gamma<-par[3]
  for (i in 5:11){
    data_cur<-as.numeric(bal_data$data[i])
    data_u_prev<-as.numeric(bal_data$u[i-1])
    data_v_prev<-as.numeric(bal_data$v[i-1])
    bal_data$u[i]<-(x[1]*data_cur/bal_data$forecast[i-4]+(1-x[1])*(data_u_prev+data_v_prev))
    data_u_cur<-as.numeric(bal_data$u[i])
    bal_data$v[i]<-(x[2]*(data_u_cur-data_u_prev)+(1-x[2])*data_v_prev)
    data_v_cur<-as.numeric(bal_data$v[i])
    bal_data$forecast[i]<-(x[3]*(bal_data$data[i]/data_u_cur)+(1-x[3])*bal_data$forecast[i-4])
    bal_data$PV[i]<-(data_u_prev+data_v_prev)*bal_data$forecast[i-4]
    i<-i+1
    dt<-sum(bal_data$data)
    pred<-sum(bal_data$pv)
   return(dt^2-pred^2)
  }
}

x<-c(0.9,0.9,0.9)
result<-optim(x,sol3)

> result$par
[1] 0.9 0.9 0.9

下面是我用来优化代码的数据。

data                 u          v     forecast
11551714.57                   1.0506142
10860713.81                   0.9877685
10989780.35                   0.9995069
10578597.92  10995202   0     0.9621104
10343260.81             0   
10481946.15         
10144200.01         
10486943.26         
10701326.12         
10530507.92         
10633318.04

【问题讨论】:

  • 能否请您使用dput() stackoverflow.com/questions/49994249/example-of-using-dput 发布数据
  • 你的函数没有使用par 变量——你把它注释掉了。所以没有什么可以优化的。
  • 对不起,我只是尝试了几个选项,实际上代码发布在下面
  • dput 输出已发布并已粘贴修正代码

标签: r


【解决方案1】:

对不起,我只是尝试了几个选项,实际上代码发布在下面,它有 par 变量。

gttt1<-function(par){
  bal_data<- read.csv("C:/Gitaish_bkp/gitaish/Oracle/ittemar/kpmg docs/hw/bal_data.csv", header=TRUE,sep=",",stringsAsFactors =FALSE)
  final_trend<-data.frame(u= numeric(0))
  #alpha<-0.5
  #beta<-0
  #gamma<-0.76
  for (i in 5:11){
    data_cur<-as.numeric(bal_data$data[i])
    data_u_prev<-as.numeric(bal_data$u[i-1])
    data_v_prev<-as.numeric(bal_data$v[i-1])
    bal_data$u[i]<-(par[1]*data_cur/bal_data$forecast[i-4]+(1-par[1])*(data_u_prev+data_v_prev))
    data_u_cur<-as.numeric(bal_data$u[i])
    bal_data$v[i]<-(par[2]*(data_u_cur-data_u_prev)+(1-par[2])*data_v_prev)
    data_v_cur<-as.numeric(bal_data$v[i])
    bal_data$forecast[i]<-(par[3]*(bal_data$data[i]/data_u_cur)+(1-par[3])*bal_data$forecast[i-4])
    bal_data$PV[i]<-(data_u_prev+data_v_prev)*bal_data$forecast[i-4]
    i<-i+1
    dt<-sum(bal_data$data)
    pred<-sum(bal_data$pv)
    return(dt^2-pred^2)
  }
}

result<-optim(par=c(0,0,0),gttt1)
result$par
[1] 0 0 0

【讨论】:

    【解决方案2】:

    输入数据帧的 Dput 输出

    structure(list(row_values = 1:11, cumm_days = c(NA, 28L, 57L, 
    89L, 119L, 148L, 180L, 209L, 237L, 270L, 301L), Days_between = c(NA, 
    28L, 29L, 32L, 30L, 29L, 32L, 29L, 28L, 33L, 31L), Dates = c("22-08-2017", 
    "19-09-2017", "18-10-2017", "19-11-2017", "19-12-2017", "17-01-2018", 
    "18-02-2018", "19-03-2018", "16-04-2018", "19-05-2018", "19-06-2018"
    ), data = c(11551714.57, 10860713.81, 10989780.35, 10578597.92, 
    10343260.81, 10481946.15, 10144200.01, 10486943.26, 10701326.12, 
    10530507.92, 10633318.04), u = c(NA, NA, NA, 10995202, NA, NA, 
    NA, NA, NA, NA, NA), v = c(NA, NA, NA, 0L, 0L, NA, NA, NA, NA, 
    NA, NA), forecast = c(1.0506142, 0.9877685, 0.9995069, 0.9621104, 
    NA, NA, NA, NA, NA, NA, NA), PV = c(NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA), alpha = c(0.330281472, 0.330281472, 0.330281472, 
    0.330281472, 0.330281472, 0.330281472, 0.330281472, 0.330281472, 
    0.330281472, 0.330281472, 0.330281472), beta = c(0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), gamma = c(0.529463573, 0.529463573, 
    0.529463573, 0.529463573, 0.529463573, 0.529463573, 0.529463573, 
    0.529463573, 0.529463573, 0.529463573, 0.529463573), To_be_used = c(NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, 
    -11L))
    

    输出数据帧的 Dput 输出

    list(par = c(0, 0, 0), value = 13759831687347294, counts = c(function = 4L, gradient = NA), convergence = 0L, message = NULL) 
    

    【讨论】:

      猜你喜欢
      • 2013-11-15
      • 2019-03-23
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      相关资源
      最近更新 更多