【问题标题】:univariate non linear optimisation in RR中的单变量非线性优化
【发布时间】:2015-02-19 18:16:48
【问题描述】:

我正在尝试在 R 中找到与 MATLAB 的信任区域反射算法类似的解决方案。之前已经提出过这个问题,但要求作者提供可重复的示例。我无法在那里发表评论,所以唯一的解决方案是发布新问题。这是我的例子:

    x <- c(5000,5000,5000,5000,2500,2500,2500,2500,1250,1250,1250,1250,625,625, 625,625,312,312,312,312,156,156,156,156)
    y <- c(0.209065186,0.208338898,0.211886104,0.209638321,0.112064803,0.110535275,0.111748670,0.111208841,0.060416469,0.059098975,0.059274827,0.060859512,0.032178730,0.033190833,0.031621743,0.032345817,0.017983939,0.016632180,0.018468540,0.019513489,0.011490089,0.011076365,0.009282322,0.012309134)

由于初始参数值是我尝试使用“nls2”包的核心问题,该包使用“蛮力”算法来找到好的起始参数。即使这样,nls 和 nls.lm 也无法收敛。下面是一些基本代码:

    library('nls2'); library('minpack.lm')
    fo <- y ~ I(A * (x ^ B) + C)
    sA <- seq(-2,1,len=10) # range of parameter values
    sB <- seq(-1,1,len=10)
    sC <- seq(-1,1,len=10)
    st1 <- expand.grid(A=sA,B=sB,C=sC)
    mod1 <- nls2(fo,start=st1,algorithm="brute-force")
    fit_ <- nls(fo,start=coef(mod1)) # basic nls
    # or nls.lm
    fit_ <- nlsLM(fo, start=coef(mod1),algorithm = "LM")

MATLAB 制作:

     a =   7.593e-05  (6.451e-05, 8.736e-05)
     b =      0.9289  (0.9116, 0.9462)
     c =    0.002553  (0.001333, 0.003772)

     Goodness of fit:
       SSE: 2.173e-05
       R-square: 0.9998
       Adjusted R-square: 0.9998
       RMSE: 0.001017

是的,使用这些参数值,R 也产生了解决方案。 问题:如何在不使用matlab的情况下在R中获得这个?

【问题讨论】:

    标签: r


    【解决方案1】:

    查看绘制的数据后,我可以毫无问题地猜测合适的起始值:

    plot(y ~ x)
    

    数据几乎在一条通过 0 的直线上。所以好的起始值 vor B 和 C 应该分别为 1 和 0。然后你只需要猜测直线的斜率。当然您也可以使用lm(y ~ x) 来查找 A 和 C 的起始值。

    fo <- y ~ A * (x ^ B) + C
    DF <- data.frame(x, y)
    
    fit <- nls(fo, start = list(A = 0.001, B = 1, C = 0), data = DF)
    summary(fit)
    #Formula: y ~ A * (x^B) + C
    #
    #Parameters:
    #   Estimate Std. Error t value Pr(>|t|)    
    #A 7.593e-05  5.495e-06  13.820 5.17e-12 ***
    #B 9.289e-01  8.317e-03 111.692  < 2e-16 ***
    #C 2.552e-03  5.866e-04   4.351 0.000281 ***
    #---
    #Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    #
    #Residual standard error: 0.001017 on 21 degrees of freedom
    #
    #Number of iterations to convergence: 5 
    #Achieved convergence tolerance: 9.084e-07
    
    lines(seq(min(x), max(x), length.out = 100),
          predict(fit, newdata = data.frame(x = seq(min(x), max(x), length.out = 100))),
          col = "blue")
    

    【讨论】:

    • 我需要对许多类似的 x,y 值集执行此操作;我不能发布那么多数据来提供完整的图片;我想设置一组约束并遍历所有数据集。这种情况停止了循环执行;因此本身不是问题,但与其他情况的细微差别导致 R '中止',而 MATLAB 总是产生解决方案。我在拟合高斯混合时遇到了同样的问题(这是一个完全不同的问题,我知道),但结果是一样的:MATLAB 的信任域算法在很多情况下都优于 R,这让我作为 R 用户感到沮丧。
    • 如果您对信任区域算法感到满意,请使用它。可以使用包trust
    • trust 中我必须指定我无法提前知道的objfun。 matlab 函数使用的直接性令人信服。
    猜你喜欢
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    相关资源
    最近更新 更多