【问题标题】:Minimum of a multidimensional function多维函数的最小值
【发布时间】:2021-09-05 21:58:29
【问题描述】:

我有一个函数 R^5 -> R,我对它的最小值感兴趣。 R 中有很多函数,例如 R 包 pracma 中的 optim、optimize 或 fminbnd。但他们只接受一个论点,我不明白帮助页面。

mindisturbed <- function(a,d1,d2,d3,p){
  sum((data^(- a) * (d1 + d2*cos(log(data)*2*pi/p) + d3 *
                            sin(log(data)*2*pi/p)) - log(j))^2)
}

“data”和“j”变量在我的全局设置中。这些是长度为 k 的向量。函数的参数都是长度为1的数字,函数是残差平方和。

那么有谁知道如何根据它的所有参数最小化这个函数?

【问题讨论】:

    标签: r optimization minimum


    【解决方案1】:

    假设 data 和 j 是相同长度的向量,请尝试以下操作。您可能需要也可能不需要更好的起始值。

    1) 像这样使用优化

    st <- c(a = 1, d1 = 1, d2 = 1, d3 = 1, p = 1)
    f <- function(x) mindisturbed(x[1], x[2], x[3], x[4], x[5])
    optim(st, f)
    

    2) 或带有默认算法的 nls,其中 st 来自 (1)

    fo <- log(j) ~ data^(- a) * (d1 + d2*cos(log(data)*2*pi/p) + d3 *
                            sin(log(data)*2*pi/p))
    nls(fo, start = st)
    

    3) 或带有 plinear 算法的 nls。在这种情况下,公式的 RHS 是一个列名为 d1、d2 和 d3 的矩阵,使得第一列乘以 d1、第二列 d2 和第三列 d3。 start 中只指定了非线性参数,即 a 和 p。

    fo2 <- log(j) ~ data^(-a) * cbind(d1 = 1, 
                                      d2 = cos(log(data)*2*pi/p), 
                                      d3 = sin(log(data)*2*pi/p))
    nls(fo2, start = c(a = 0.1, p = 0.1), algorithm = "plinear")
    

    注意

    这个问题没有包含 data 和 j 但我们可以用这些来试一试。

    set.seed(123)
    n <- 100
    data <- runif(n, 1, 2)
    j <- 1:n
    
    o <- order(data)
    j <- j[o]
    data <- data[o]
    

    【讨论】:

    • 非常感谢。我不确定如何在 optim 函数中设置此数值算法的起始值。所以我要尝试一些值。但我很高兴知道该功能正在运行。
    • 如图所示,nls 与 plinear 只需要 2 个起始值而不是 5 个。如果尝试不起作用,请使用 nls2 包搜索起始值。
    • 哦,我看到这个包裹是你送的;)
    猜你喜欢
    • 2011-05-28
    • 2018-10-26
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2019-11-05
    • 2016-06-21
    • 2017-12-25
    相关资源
    最近更新 更多