簡體   English   中英

R中的優化

[英]Optimization in R

我有以下優化問題:

在此處輸入圖片說明

關於y我們正在最小化。 A是已知矩陣, b是已知向量, c是已知常數。

這里有兩個重要的事情:當我們試圖最小化函數時, 它不能小於0 同樣,使用不需要初始值的R方法將是理想的,因為將y的可行起始值視為目標非常復雜。

R中是否有任何軟件包/功能可以讓我實現此問題? 任何幫助將不勝感激! 謝謝。

我贊同@Stu的“優化”建議。 這是在您的情況下使用它的快速示例:

set.seed(1001)
c = 1
m = 10
b = runif(m)

loss_fun = function(y_i){
  if (all(y_i>=0)){  # <- Here is where we enforce all y's >=0
    return(c - sum(b*log(y_i)))
  }else{
    return(9e9)      # If any y's are negative, return a very large number
  }
}

y_initial = runif(m)

print(optim(y_initial, loss_fun))

希望能有所幫助。

更新 :對不起,您的“ Ay”與“ For All y”混淆了。 嘗試這樣的事情:

set.seed(1001)
c = 1
m = 10
b = runif(m)
A = matrix(runif(m*m), nrow=m)

loss_fun = function(y_i){
  if (all(A%*%y_i>0)){
    return_val = (c - sum(b*log(y_i)))
  }else{
    return_val = 9e9
  }
  if ((c - sum(b*log(y_i)))<0.000001){
    return_val = 9e9
  }
  else{
    return_val = (c - sum(b*log(y_i)))
  }
  return(return_val)
}

y_initial = runif(m)

print(optim(y_initial, loss_fun, method = "L-BFGS-B", lower = 0))

您可能需要嘗試不同的方法和y的界限,才能使其正常運行。

這里的總體思想是通過返回較大的值(如果損壞了)來強制執行約束(損失函數中的“ if”條件)。

更新2 :如果函數返回錯誤值“ 9e9”,則將其收斂,因為它滿足損失函數。 例如,每隔一個可行的解決方案給出的值都大於9e9。 這意味着您沒有方法/約束的解決方案。

使用optimhttp : //stat.ethz.ch/R-manual/R-devel/library/stats/html/optim.html

此功能允許您使用幾種不同的方法來優化具有約束的功能。

查看示例,以更好地了解您的問題如何適應optim

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM