Optimasi merupakan suatu proses untuk mecari kondisi yang optimum, dalam arti paling maksimal, atau paling minimal. Optimasi dapat dilakukan dengan meminimumkan atau memaksimumkan suatu fungsi
Untuk mendapatkan turunan dari suatu fungsi pada pemrograman R dapat menggunakan fungsi
D(expr, simbol) : jika hasil turunan merupakan suatu
fungsideriv(~fungsi, simbol) : jika akan memasukkan nilai
dari hasil turunan pada suatu fungsiContoh, akan dicari turunan dari fungsi berikut
\(\begin{aligned} f(x) = e^{(x^2)} \end{aligned}\)
## exp(x^2) * (2 * x)
\(\begin{aligned} f(x) = x^2 \end{aligned}\)
untuk nilai \(x=3\)
## [1] 9
## attr(,"gradient")
## x
## [1,] 6
Fungsi integral yang dapat digunakan pada R adalah
integrate(fungsi, lower, upper). Selain itu, terdapat
fungsi yac_str() pada package Ryacas untuk
mencari integral tak tentu.
Contoh menggunakan fungsi integrate:
\(\begin{aligned} \int x^2 dx \end{aligned}\)
## 0.3333333 with absolute error < 3.7e-15
\(\begin{aligned} \int x^2 +4x dx \end{aligned}\)
## 666.6667 with absolute error < 7.6e-12
\(\begin{aligned} \int t^4 e^{-t} dt \end{aligned}\)
## 24 with absolute error < 2.2e-05
Contoh dengan fungsi yac_str pada paket
Ryacas
##
## Attaching package: 'Ryacas'
## The following object is masked from 'package:stats':
##
## integrate
## The following objects are masked from 'package:base':
##
## %*%, diag, diag<-, lower.tri, upper.tri
\(\begin{aligned} \int x^2 + 4xdx \end{aligned}\)
## [1] "x^3/3+2*x^2"
\(\begin{aligned} \int t^4 e^{-t} dt \end{aligned}\)
## [1] "4*(3*((-2)*(t+1)*Exp(-t)-t^2*Exp(-t))-t^3*Exp(-t))-t^4*Exp(-t)"
Mendapatkan nilai optimum dari suatu fungsi merupakan suatu teknik optimasi numerik. Optimasi dapat dilakukan pada satu variabel atau pun lebih dari satu variabel. Fungsi dengan satu variabel, misalkan \(y=f(x)\), kemudian akan dicari nilai \(x\)yang memaksimumkan/ meminimumkan nilai \(y\). Sehingga, \(x\) yang diperoleh merupakan nilai \(x\) yang paling optimum. Beberapa metode yang dapat dilakukan untuk optimasi satu variabel adalah metode golden section search, metode newton raphson. Fungsi dengan banyak variabel, misalkan \(y=f ( x_1, x_2, …, x_n)\), kemudian akan dicari nilai \(x_i\) yang meminimumkan fungsi \(y\).
Paket R untuk optimisasi
| Problem type | Package | Routine |
|---|---|---|
| General purpose (1-dim) | built-in | optimize(...) |
| General purpose (n-dim) | built-in | optim(...) |
| Linear Programming | lpSolve |
lp(...) |
| Quadratic Programming | quadprog |
solve.QP(...) |
| Non-Linear Programming | optimize |
optimize(...) |
optimx |
optimx(...) |
|
| General Interface | ROI |
ROI_solve(...) |
Metode golden section search digunakan untuk mencari nilai minimum suatu fungsi yang dibatasi dari dua buah nilai, yaitu sebuah selang a dan b. Algoritma untuk teknik ini adalah sebagai berikut:
Pemilihan nilai \(a'\) dan \(b'\), adalah sebagai berikut
Nilai antara [a,b] memiliki sifat golden ratio
Tentukan \(x_1\) dan \(x_2\)
\(x_1 = b-(b-a)/\mathrm{goldenratio}\)
\(x_2 = a+(b-a)/\mathrm{goldenratio}\)
Hitung \(f(x_1)\) dan \(f(x_2)\)
Jika \(f(x_1) > f(x_2)\) maka \([a’, b’] = [x_1, b]\)
Jika \(f(x_1) < f(x_2)\) maka \([a’, b’] = [a, x_2]\)
Fungsi golden section
golden <- function (f, a, b, tol=0.0000001) {
ratio <- 2 / ( sqrt (5)+1)
x1 <- b-ratio * (b-a)
x2 <- a+ratio * (b-a)
f1 <- f(x1)
f2 <- f(x2)
while ( abs (b-a)>tol){
if (f2>f1){
b <- x2
x2 <- x1
f2 <- f1
x1 <- b-ratio * (b-a)
f1 <- f(x1)
} else {
a <- x1
x1 <- x2
f1 <- f2
x2 <- a+ratio * (b-a)
f2 <- f(x2)
}
}
return ((a+b) / 2)
}Contoh:
\(\begin{aligned} f(x) = |x -3.5| (x-2)^2 \end{aligned}\)
## [1] 2
## [1] 2.5
## [1] 3
\(\begin{aligned} f(x) = 2\mathrm{sin}(x) - \frac{x^2}{10} \end{aligned}\)
Membuat fungsi \(f(x)\)
# Membuat fungsi f(x)
f <- function(x) {(2 * sin(x)) - ((x^2) /10)}
fa <- function(x) -1 * f(x) # fungsi dikali dengan -1 karena fungsi yang dibuat meminimumkan
# Membuat plot
curve(f, 0,4)## [1] 1.427552
Jika suatu fungsi memiliki turunan pertama dan kedua, maka nilai minimum dapat menggunakan metode Newton Raphson. Kelebihan metode ini adalah hanya memerlukan satu nilai untuk inisial. Kelemahannya adalah kita harus yakin f(x) memiliki turunan pertama dan turunan kedua. Jika di golden section tidak perlu ada turunan pertama dan turunan kedua.
Fungsi Newton Raphson
newtonr <- function (fx , x0 =1){
fx1 <- deriv (fx ,"x") # turunan pertama
fx2 <- deriv (D(fx ,"x"),"x") # turunan kedua
er <- 1000
while(er > 1e-6){
x <- x0
f1 <- attr ( eval (fx1),"gradient")[1]
f2 <- attr ( eval (fx2),"gradient")[1]
er <- abs(f1) # bisa juga e <- abs (x1 -x0)
x1 <- x0 - f1/f2
x0 <- x1
}
return (x1)
}Hitung nilai minimum untuk fungsi- fungsi berikut.
\(\begin{aligned} f(x) = 4x^2 - 3x - 7 \end{aligned}\)
## [1] 0.375
\(\begin{aligned} f(x) = e^{-x}+x^4 \end{aligned}\)
## [1] 0.5282519
\(\begin{aligned} f(x) = x^2 - x \end{aligned}\)
## [1] 0.5
Algoritma Nelder Mead adalah salah satu metode optimasi untuk fungsi yang memiliki lebih dari satu variabel. Di dalam R, fungsi optimasi dengan salah satu algoritma tersebut adalah
optimize atau optimise untuk menduga
parameter/ mencari nilai minimum dari satu peubahoptim untuk lebih dari satu peubahoptimize/optimise\(\begin{aligned} f(x) = \left( x - \frac{1}{3} \right)^2 \end{aligned}\)
## $minimum
## [1] 0.3333333
##
## $objective
## [1] 0
Carilah titik maksimum dan minimum dari fungsi berikut:
\(\begin{aligned} f(x) = \mathrm{sin}(x) + \mathrm{sin}(2x) + \mathrm{cos}(3x) \end{aligned}\)
## $minimum
## [1] 3.033129
##
## $objective
## [1] -1.054505
## $minimum
## [1] 5.273383
##
## $objective
## [1] -2.741405
## $maximum
## [1] 4.0598
##
## $objective
## [1] 1.096473
## $maximum
## [1] 0.3323289
##
## $objective
## [1] 1.485871
optimDigunakan untuk mencari nilai minimum dari fungsi yang lebih dari satu peubah. Contoh mencari nilai \(x_1\) dan \(x_2\), yang mebuat \(f(x_1,x_2) = 100(x_2 - x_1^2)^2 + (1-x_1)^2\)
fr <- function (x){ # tetap dituliskan dalam sebuah vektor, akan diduga x
x1<- x[1]
x2 <- x[2]
100 * (x2-x1^2)^2 + (1-x1)^2 # ini adalah nilai fungsi objetivenya
}
# argumen pertama adalah nilai inisial, karena menduga x vektor berukuran 2 maka dimasukkan nilai inisialnya
optim (c(-1.2,1),fr) ## $par
## [1] 1.000260 1.000506
##
## $value
## [1] 8.825241e-08
##
## $counts
## function gradient
## 195 NA
##
## $convergence
## [1] 0
##
## $message
## NULL
## $par
## [1] 3.033154
##
## $value
## [1] -1.054505
##
## $counts
## function gradient
## 32 NA
##
## $convergence
## [1] 0
##
## $message
## NULL
## $par
## [1] 5.273389
##
## $value
## [1] -2.741405
##
## $counts
## function gradient
## 32 NA
##
## $convergence
## [1] 0
##
## $message
## NULL
Jika akan mencari nilai maksimum, maka function dikali -1.
## $par
## [1] 4.059814
##
## $value
## [1] -1.096473
##
## $counts
## function gradient
## 28 NA
##
## $convergence
## [1] 0
##
## $message
## NULL
## $par
## [1] 6.615576
##
## $value
## [1] -1.485871
##
## $counts
## function gradient
## 28 NA
##
## $convergence
## [1] 0
##
## $message
## NULL
## $par
## [1] 0.3323242
##
## $value
## [1] -1.485871
##
## $counts
## function gradient
## 32 NA
##
## $convergence
## [1] 0
##
## $message
## NULL
Fungsi polinomial
\(\begin{aligned} f(x) = 4x^4 - 2x^3 - 3x \end{aligned}\)
## $par
## [1] 0.728418
##
## $value
## [1] -1.832126
##
## $counts
## function gradient
## 36 NA
##
## $convergence
## [1] 0
##
## $message
## NULL
Metode kuadrat terkecil pada regresi adalah mencari parameter \(\beta\) sehingga jumlah kuadrat sisaan adalah minimum. Jadi meminimumkan dari fungsi kuadrat sisaan. Sehingga objective function-nya adalah kuadrat sisaan.
f <- function (para,y,x){
X <- cbind (1,x)
yhat <- X %*% as.matrix(para)
sisa2 <- sum((y-yhat)^2) # kuadrat sisaan
return(sisa2)
}# simulasi
x1 <- runif (10,1,10)
x2 <- runif (10,1,10)
galat <- rnorm (10,0,0.5)
y <- 1+2*x1+3*x2+galat # untuk menduga nilai beta## [1] 0.6582865 2.1109194 2.9339999
##
## Call:
## lm(formula = y ~ x1 + x2)
##
## Coefficients:
## (Intercept) x1 x2
## 0.6634 2.1106 2.9336
Contoh:
Lakukan pendugaan paramater regresi dengan meminimumkan jumlah
kuadrat galat (residual sum of square) dari data berikut! Kemudian
bandingkan hasilnya dnegan output fungsi lm!
| x | y |
|---|---|
| 1 | 1 |
| 2 | 3 |
| 3 | 5 |
| 4 | 6 |
| 5 | 8 |
| 6 | 12 |
data5=data.frame(x=c(1,2,3,4,5,6),
y=c(1,3,5,6,8,12))
JKG <- function(data, b) {
with(data, sum((b[1]+b[2]*x-y)^2))}
hasil1 <- optim(par = c(1,1), fn = JKG, data = data5)
hasil2 <- lm(y~x, data = data5)
plot(data5)
abline(hasil1$par,col=4)## [1] -1.266302 2.028449
## (Intercept) x
## -1.266667 2.028571
## [1] 2.819048
## [1] 2.819048
##
## Call:
## lm(formula = y ~ x, data = data5)
##
## Residuals:
## 1 2 3 4 5 6
## 0.2381 0.2095 0.1810 -0.8476 -0.8762 1.0952
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.2667 0.7815 -1.621 0.180388
## x 2.0286 0.2007 10.109 0.000539 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.8395 on 4 degrees of freedom
## Multiple R-squared: 0.9623, Adjusted R-squared: 0.9529
## F-statistic: 102.2 on 1 and 4 DF, p-value: 0.000539
Metode ini adalah metode yang paling sering digunakan untuk menduga parameter sebaran. Mencari nilai maksimum dari suatu fungsi tujuan yang berupa fungsi likelihood-nya. Untuk mendapatkan likelihood merupakan perkalian dari fungsi sebaran, lebih mudah menduga teta dengan mentransformasi fungsi likelihood menjadi negatif log likelihood
Sebagai contoh, jika \(x_1, x_2, ..., x_n\) berasal dari peubah acak \(X \sim N(\mu, \sigma)\), tentukan penduga \(\mu\) dan \(\sigma\) menggunakan MLE. Jika log likehood saja meminimumkan, maka menjadi negatif log likelihood suapaya dimaksimumkan.
negloglik <- function (para,xd){
nilai <- -1* sum (dnorm (xd, mean =para[1], sd=para[2], log= TRUE)) # penjumlahan fungsi likelihood distribusi normal
return (nilai)
}
x <- rnorm (10,2,5)
hasil <- optim (c(1,1),negloglik,xd=x)
cat ("Hasil MLE:", hasil $par)## Hasil MLE: -0.7738515 3.884483
## [1] -0.7733304 4.0954121
Pendugaan untuk regresi linear dengan menggunakan metode kemungkinan maksimum.
Sebagai contoh, akan diduga parameter dari regresi linear sederhana dengan menggunakan MLE. Contoh soal sebelumnya akan digunakan kembali.
Fungsi log likelihood dari Regresi Linear Sederhana adalah sebagai berikut:
\(\begin{aligned} \mathrm{log}L(\beta_0, \beta_1, \sigma^2) = -\frac{n}{2}\mathrm{log}(2\pi) - \frac{n}{2}\mathrm{log}(\sigma^2) - \frac{1}{2\sigma^2}\sum_{i=1}^n (y_i - \beta_0 - \beta_1x_i)^2 \end{aligned}\)
Cara pertama:
regloglik <- function (beta, y, X) {
n <- nrow(X) # jumlah baris pada matrix x
k <- ncol(X) # jumlah kolom pada matrix x
beta0 <- beta[1]
beta1 <- beta[2]
var.lin <- beta[3]
e <- y - X %*% beta[1:2] # menghitung sisaan
logl <- -0.5*n*log(2*pi) - 0.5*n*log(var.lin) - ((t(e)%*%e)/(2*var.lin))
return(-logl)
}## [1] -1.2669724 2.0286218 0.4698408
Cara kedua:
regloglik <- function (para,y, x){
# fungsi terdiri dari 3 parameter dalam argumen para
# beta0 = para [1]
# beta1 = para [2]
# sigma = para [3]
# nilai tengah dari regresi linear adalah beta0 + b1x1
# standar deviasi adalah sigma
nilai <- -1* sum (dnorm (y, mean =para[1]+ x*para[2], sd=para[3], log= TRUE))
return (nilai)
}
x=c(1,2,3,4,5,6)
y=c(1,3,5,6,8,12)
hasil <- optim (c(1,1,1),regloglik,y =y, x=x)
cat ("Hasil MLE:", hasil $par)## Hasil MLE: -1.266469 2.028513 0.6853899
Mahasiswa Pascasarjana IPB, alfanugraha@apps.ipb.ac.id↩︎