2016-08-28 98 views
0

我有以下一組功能。性能分析功能,已經優化過了優化

funk <- function(x,b) { 10^b * exp(-x/10) } 

lambda <- function(y,k) { exp(-k*y) } 

funk1 <- function(y,x,xb,b,k) { 
funk(x-xb-y,b) *exp(- integrate(lambda, lower=0, upper = y, k=k)$value) } 

funk2 <-function(x,xb,b,k) { 
integrate(funk1, lower= 0, upper=x-xb, x=x,xb=xb, b=b,k=k)$value } 

funk2_vc <- Vectorize(funk2) 

optim_funk2 <- function(param) { 
b <-param[1] 
k <- param[2]    
R1 <- sum((y - funk2_vc(xx,xb,b,k))^2) 
-log(R1) } 

fit <- optim(par=c(5, 0.05), fn=optim_funk2) 

xx <- seq(0,500,5) 
xb <- seq(0,100,1) 
y <- seq(1000,0,-10) 

我要分析的功能funk2弄清楚,optim採取估算的參數值,如果功能optimizied本地或全球最小的路徑。

我是R的新手,不知道如何去做。所有的建議歡迎。

回答

1

這裏有一個簡單的方法來跟蹤參數的路徑。我將以線性迴歸爲例。說我們的數據是

x <- 1:10 
y <- -3 + 2 * x + rnorm(length(x)) 
plot(x, y) 

所以yx加上一些噪聲的線性函數。我們的目標是找到參數a和b,使得誤差平方和sum((y - (a + b * x))^2)最小化。 (當然這是可以用代數解決,但爲了說明,我們將與optim()解決它。)

下面的代碼做優化和跟蹤參數:

par.path <- matrix(nrow=0, ncol=2, dimnames=list(NULL, c("a","b"))) 

funk <- function(par) { 
    a <- par[1]; b <- par[2] 
    par.path <<- rbind(par.path, par) 
    sum((y - (a + b * x))^2) 
} 

optim(par=c(0,0), fn=funk) 

第一行創建一個稱爲par.path的0行矩陣存儲參數路徑。在目標函數funk中,我們將當前值par添加到par.path。請注意,我們必須使用<<-而不是<-來更新par.path,因爲它不在funk的範圍內。 (如果我們使用<-,然後funk將創建一個新的局部變量也稱爲par.path,並且功能外par.path不會得到更新。)由於optim調用funk反覆,par.path將得到越來越長(多行)。

有多種方法可以繪製矩陣par.path。因爲在這種情況下,只有兩個參數,我們就可以繪製它們對對方:

plot(par.path, type='l') 
points(par.path[c(1,nrow(par.path)),], col=c("green","red"), cex=2, pch=16) 

第二行增加了綠色和紅色圓點指示路徑的開始和結束。更靈活,我們就可以繪製的par.path所有列反對optim迭代次數:

matplot(par.path, type='l', col=c("black","red"), lty=1) 
legend("bottomleft", c("a","b"), col=c("black","red"), lty=1) 

下面是這兩個地塊。 paramter path plots

+0

感謝您的答案,並使其真正理解。我正在尋找其他東西,但我用完全相同的邏輯找到了答案。萬分感謝! – VitalSigns