簡體   English   中英

R中的3參數非線性方程擬合

[英]3 parameter nonlinear equation fitting in R

我試圖在 R 中找到一種方法,它允許一般方程 a*b^x + c 的參數(a、b、c)提供最適合 3 個約束隨機坐標/點(p1、p2、p3 - 坐標分別為 x1/y1、x2/y2 和 x3/y3)。

這些坐標的約束是:

  • x1 和 y3 都等於 0
  • x3 和 y1 都是隨機抽取的,並且都小於 1
  • x2 被分配了一個小於 x3 的隨機值
  • y2 被分配了一個小於 y1 的隨機值

我想找到一種能夠為 a、b 和 c 生成值的方法,它生成一條接近 p1、p2 和 p3 的線。 這只是使用 desmos(示例參見此處 - https://www.desmos.com/calculator/4lmgazmrko ),但我無法在 R 中找到解決方案。我嘗試了以下方法:

x <- c(0, 0.7, 0.9)
y <- c(0.9, 0.8, 0)
df_test <- as.data.frame(cbind(x, y))

predict_y_nonlinearly <- function(beta, x){
  beta[1]*(beta[2]^x) + beta[3]
}

a_nonlinearmodel <- function(beta, x, y){
  y_hat <- predict_y_nonlinearly(beta, x)
  sum((y-y_hat)^2)
}

beta <- optim(rnorm(3), a_nonlinearmodel, method = "SANN",
              y = df_test$y, x = df_test$x)$par

predict_y_nonlinearly(beta, df_test$x)

但是優化 function 似乎陷入了局部最小值,並且很少產生正確的解決方案(即使使用不同的“方法”設置)。 我知道 nls function,但這需要選擇起始值——我更喜歡在這個階段不需要手動輸入的方法(因為 desmos 方法能夠實現)。

謝謝

給定兩個零約束,我們可以通過分析將其簡化為單參數問題:

x1 = 0 → y1 = a + c → c = y1-a
y3 = 0 → 0 = a*b^x3 + (y1-a)
→ a*(b^x3 - 1) = -y1
→ a = y1/(1-b^x3)

所以我們有一個預測y的單參數 function,包含x1 = y3 = 0約束:

predfun <- function(b = 1, x, y)  {
  a <- y[1]/(1-b^x[3])
  c <- y[1] - a
  a*b^x +c
}

平方和目標 function:

target <- Vectorize(function(b) sum((y - predfun(b, x, y))^2))

可視化:

curve(target, from = -10000, to = 100000, log = "y")

曲線顯示在負值處出現分歧,在 6e+04 附近出現明顯的最小值

現在使用optimize()進行一維優化(我們仍然需要指定一個起始區間,雖然不是一個具體的起始點)。

optimize(target, c(-10000, 1000000))

結果:

$minimum
[1] 58928.93

$objective
[1] 2.066598e-20

暫無
暫無

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

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