Optimasi adalah suatu proses untuk mencari kondisi yang optimum atau kondisi paling menguntungkan. Optimasi dapat berupa nilai maksimum ataupun nilai minimum tergantung pada penggunaannya.
Jika berkaitan dengan masalah keuntungan, maka keadaan optimum adalah keadaan yang memberikan keuntungan maksimum (maksimasi). Jika berkaitan dengan masalah pengeluaran/pengorbanan, maka keadaan optimum adalah keadaan yang memberikan pengeluaran/pengorbanan minimum (minimasi).
Fungsi yang akan diminimumkan atau dimaksimumkan disebut fungsi objektif (objective function). Secara umum, mencari nilai maksimum dan minimum dari suatu fungsi adalah dengan mencari titik-titik kritis dari fungsi, kemudian mensubstitusikan titik kritis tersebut ke turunan pertama dari fungsi. Nilai terbesar adalah nilai maksimum dan nilai terkecil adalah nilai minimum dari fungsi tersebut.
Nilai maksimum dan minimum ada yang bersifat global dan lokal. Secara umum, suatu nilai optimum merujuk pada nilai yang bersifat global yaitu nilai maksimum dan minimum dalam suatu fungsi di dalam suatu selang. Namun bisa jadi dalam selang tersebut, terdapat titik-titik kritis lainnya yang membuat nilai menjadi maksimum dan minimum di dalam bagian dari selang. Itulah yang disebut nilai maksimum dan minimum lokal. Berikut adalah ilustrasinya
Package yang digunakan
## Error in get(genname, envir = envir) : object 'testthat_print' not found
Fungsi Kalkulus : Integral dan Diferensial
Diferensial
Untuk mendapatkan turunan dari fungsi dapat dengan menggunakan fungsi yang sudah disediakan oleh R yaitu D atau deriv.
Contoh :
Turunan dari \[\mathrm{f(x)} = x^2\]
## exp(x^2) * (2 * x)
atau
## [1] 4
## attr(,"gradient")
## x
## [1,] 4
Integral
Untuk mendapatkan integral dari suatu fungsi, dapat menggunakan fungsi yang sudah disediakan oleh R yaitu fungsi integrate atau dengan menggunakan package Ryacas
Integral Tak Tentu
Integral tak tentu dapat dicari dengan menggunakan fungsi yac_str. Contoh :
- Integral dari \[\mathrm{f(x)} = x^2 + 4x\]
## [1] "x^3/3+2*x^2"
- Integral dari \[\mathrm{f(x)} = t^4 exp(-t)\]
## [1] "4*(3*((-2)*(t+1)*Exp(-t)-t^2*Exp(-t))-t^3*Exp(-t))-t^4*Exp(-t)"
Integral Tentu
Integral tentu dapat dicari dengan menggunakan fungsi integrate.
- Integral dari \[\mathrm{f(x)} = x^2 + 4x\] dengan batas -10 sampai 10
## 666.6667 with absolute error < 7.6e-12
- Integral dari \[\mathrm{f(x)} = t^4 exp(-t)\] dengan batas 0 sampai tak hingga
## 24 with absolute error < 2.2e-05
## [1] 24
Optimasi Numerik
Metode pendugaan statistik umumnya membutuhkan nilai maksimum atau minimum seperti :
* Metode Kuadrat Terkecil: Meminimumkan fungsi jumlah kuadrat sisaan
* Metode Kemungkinan Maksimum: Memaksimumkan fungsi kemungkinan (likelihood)
Optimasi dibagi menjadi dua yaitu Optimasi Satu Variabel dan Optimasi Banyak Variabel
Optimasi Satu Variabel
Optimasi satu variabel digunakan saat fungsi objektif hanya memiliki 1 variabel penjelas.
Metode yang digunakan :
• Metode golden section
• Metode Newton
Metode Golden Section
Golden section merupakan salah satu cara atau metode optimasi numerik yang dapat diterapkan untuk fungsi yang bersifat unimodal.
Ide dasar metode ini adalah memanfaatkan nilai yang lama sebagai nilai yang baru, secara iteratif. Sebagai akibatnya, rentang/ interval awal variabel yang dipilih semakin lama akan semakin menyempit, karena ada sebagian sub-interval variabel yang dieliminasi, hingga diperoleh tingkat konvergensi yang diinginkan.
Berikut adalah ilustrasi dari golden ratio :
Algoritma Golden Section (Untuk nilai minimum)
Tentukan selang [a, b] yang memuat nilai minimum. Dapat dilihat dengan menggunakan grafik fungsi
Perkecil selang menjadi [a’, b’] yang memuat nilai minimum atau maksimum. Kriteria pemilihan a’ dan b’ adalah nilai diantara a dan b, sesuai dengan golden ratio
a’ = a + d
b’ = a - ddengan d = R (b-a)
Tentukan x1 dan x2
x1 = b - (b-a)/R
x2 = a + (b-a)/RHitung f(x1) dan f(x2)
Jika f(x1) > f(x2) maka [a’,b’]=[x1,b]
Jika f(x1) < f(x2) maka [a’,b’]=[a,x2]Iterasi sampai |b’-a’| lebih kecil dari nilai tolerans
Catatan : Untuk nilai maksimum, gunakan algoritma kebalikannya.
Metode Golden Section untuk nilai minimum
goldenMin <- 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)
}Metode golden section untuk nilai maksimum
goldenMax <- 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 :
Mencari nilai minimum dari \[\mathrm{f(x)} = |x-3.5| + (x-2)^2 \]
## [1] 2
## [1] 2.5
## [1] 3
Mencari nilai maksimum dari \[\mathrm{f(x)} = 2 sin x - \frac {x^2} {10}\] di dalam interval 0 sampai 4
## [1] 1.427552
Metode Newton
Metode Newton Raphson lebih cepat dibanding Golden Section Search. Jika suatu fungsi memiliki turunan pertama dan kedua, maka nilai minimum dapat menggunakan metode Newton Raphson:
\[\mathrm{Xn} = Xn-1 - \frac {f'(Xn-1)} {f''(Xn-1)}\]
Iterasi berhenti jika f’(xn-1) dekat dengan 0 atau lebih kecil dari nilai tolerans.
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)
}Contoh :
- Hitung nilai minimum untuk fungsi \[\mathrm{f(x)} = 4x^2 - 3x - 7\]
## [1] 0.375
- Hitung nilai minimum untuk fungsi \[\mathrm{f(x)} = exp(-x) + x^4\]
## [1] 0.5282519
- Hitung nilai minimum untuk fungsi \[\mathrm{f(x)} = x^2 - x\]
## [1] 0.5
Optimasi Banyak Variabel
Algoritma Nelder-Mead adalah salah satu metode optimasi untuk fungsi yang memiliki lebih dari satu peubah.
R telah menyiapkan fungsi optimasi dengan salah satu algoritmanya adalah Nelder-Mead:
* optimize atau optimise (satu peubah)
* optim (lebih dari satu peubah)
Fungsi Optimize
Digunakan untuk mendapatkan nilai minimum dari suatu fungsi dengan satu peubah.
Contoh : Mencari nilai maksimum dan minimum dari suatu fungsi \[\mathrm{f(x)} = sin(x) + sin(2*x) + cos(3*x)\]
## $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
Contoh 2 : Mencari nilai minimum dari fungsi \[\mathrm{f(x)} = (x- \frac {1} {3})^2\]
## $minimum
## [1] 0.3333333
##
## $objective
## [1] 0
Fungsi Optim
Untuk mencari nilai minimum dari fungsi lebih dari satu peubah.
Contoh : Mencari nilai x1 dan x2 yang membuat \[\mathrm{f(x1,x2)} = 100(x2-x1^2)^2 + (1-x1)^2\] minimum
fr <- function (x) {
x1 <- x[1]
x2 <- x[2]
100 * (x2 - x1 ^2) ^2
(1 - x1)^2
}
optim (c( -1.2 ,1) , fr)## $par
## [1] 1.0002837 -0.1642825
##
## $value
## [1] 8.050091e-08
##
## $counts
## function gradient
## 47 NA
##
## $convergence
## [1] 0
##
## $message
## NULL
Optimasi Fungsi Polinomial
Mencari nilai minimum dari
\[\mathrm{f(x)} = 4x^4-2x^3-3x\]
## Warning in optim(par = c(-0.5), fn = f4): one-dimensional optimization by Nelder-Mead is unreliable:
## use "Brent" or optimize() directly
## $par
## [1] 0.728418
##
## $value
## [1] -1.832126
##
## $counts
## function gradient
## 36 NA
##
## $convergence
## [1] 0
##
## $message
## NULL
Optimasi dalam Regresi Linier
Penerapan optimisasi dalam regresi linier adalah dalam pendugaan parameter dengan metode kuadrat terkecil dan MLE.
Metode Kuadrat Terkecil
Contoh 1:
Lakukan pendugaan parameter regresi dengan meminimumkan jumlah kuadrat galat(residual sum of square) dari data berikut! Kemudian bandingkan hasilnya dengan output dari 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
Contoh 2 : Mencari penduga parameter untuk
\[\mathrm{y} = 1 + 2x1 + 3x2 + \varepsilon\]
f <- function (para , y, x){
X <- cbind (1,x)
yhat <- X %*% as.matrix (para)
sisa2 <- sum ((y- yhat)^2)
return (sisa2)
}
x1 <- runif (10 ,1 ,10)
x2 <- runif (10 ,1 ,10)
galat <- rnorm (10 ,0 ,0.5)
y <- 1 + 2*x1 + 3*x2 + galat
hasil <- optim (c(1 ,1 ,1) ,f,y=y,x= cbind (x1 ,x2))
hasil $par## [1] 2.028485 1.898759 2.944454
##
## Call:
## lm(formula = y ~ x1 + x2)
##
## Coefficients:
## (Intercept) x1 x2
## 2.028 1.899 2.945
Maximum Likelihood Estimator (MLE)
Metode ini merupakan metode yang paling sering digunakan untuk menduga parameter sebaran.
Contoh 1:
Jika x1,x2,……,xn berasal dari peubah acak X ~N(\(\mathrm\mu\);\(\mathrm\sigma\)), tentukan penduga \(\mathrm\mu\) dan \(\mathrm\sigma\) menggunakan MLE.
negloglik <- function (para ,xd){
nilai <- -1*sum ( dnorm (xd , mean = para [1] , sd= para [2] , log= TRUE ))
return ( nilai )
}
x <- rnorm (10 ,2 ,5)
hasil <- optim (c(1 ,1) ,negloglik ,xd=x)
hasil $par## [1] -0.7153722 5.2059267
## [1] -0.7137998 5.4879341
contoh 2 - MLE untuk regresi linier :
Akan digunakan data sebelumnya yang telah dikerjakan dengan metode kuadrat terkecil yaitu
| X | Y |
|---|---|
| 1 | 1 |
| 2 | 3 |
| 3 | 5 |
| 4 | 6 |
| 5 | 8 |
| 6 | 12 |
Untuk menduga parameter dalam regresi linier, akan digunakan 3 parameter yaitu :
* b0
* b1
* sigma
Catatan : Rata-rata regresi linier didapatkan dari b0 + b1x1
regloglik <- function (para,y, x){
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)
hasil$par## [1] -1.2664693 2.0285134 0.6853899
Untuk penduga parameter dengan MLE, selain dapat menggunakan fungsi optim(), R juga menyiapkan fungsi mle() pada package stats4