Optimasi

Annebel D Clarissa

3/24/2021

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

library(Ryacas)       #integral
## Error in get(genname, envir = envir) : object 'testthat_print' not found
library(optimization) #nilai maks dan min

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\]

xfs <- expression (exp(x^2))
D(xfs ,"x")
## exp(x^2) * (2 * x)

atau

xturunan <- deriv (~x^2,"x")
x <- 2
eval ( xturunan )
## [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\]
yac_str("Integrate(x) x^2 + 4*x")
## [1] "x^3/3+2*x^2"
  • Integral dari \[\mathrm{f(x)} = t^4 exp(-t)\]
yac_str("Integrate(t) 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
f1 <-function(x) x^2 + 4*x
integrate(f1,lower = -10,upper = 10)
## 666.6667 with absolute error < 7.6e-12
  • Integral dari \[\mathrm{f(x)} = t^4 exp(-t)\] dengan batas 0 sampai tak hingga
f2 <-function(t) t^(4) * exp(-t)
integrate(f2,lower = 0,upper = Inf)
## 24 with absolute error < 2.2e-05
gamma(5)
## [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)

  1. Tentukan selang [a, b] yang memuat nilai minimum. Dapat dilihat dengan menggunakan grafik fungsi

  2. 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 - d

    dengan d = R (b-a)

    Tentukan x1 dan x2
    x1 = b - (b-a)/R
    x2 = a + (b-a)/R

    Hitung 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]

  3. 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 \]

f <- function (x) { abs(x -3.5) + (x -2) ^2}
curve(f)

goldenMin (f ,1 ,2)
## [1] 2
goldenMin (f ,1 ,5)
## [1] 2.5
goldenMin (f ,3 ,5)
## [1] 3

Mencari nilai maksimum dari \[\mathrm{f(x)} = 2 sin x - \frac {x^2} {10}\] di dalam interval 0 sampai 4

g <- function (x) { 2 * sin(x) - (x^2/10)}
curve(g)

goldenMax (g ,0 ,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\]
fx <- expression (4*x^2 - 3*x - 7)
newtonr (fx ,3)
## [1] 0.375
  • Hitung nilai minimum untuk fungsi \[\mathrm{f(x)} = exp(-x) + x^4\]
fx <- expression ( exp(-x) + x^4)
newtonr (fx)
## [1] 0.5282519
  • Hitung nilai minimum untuk fungsi \[\mathrm{f(x)} = x^2 - x\]
fx <- expression (x^2 - x)
newtonr (fx)
## [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)\]

f3 <-function(x) sin(x) + sin(2*x) + cos(3*x)
curve(f3, from = 0, to = 2*pi)

optimize(f3, interval = c(0, 2*pi)) #minimum lokal
## $minimum
## [1] 3.033129
## 
## $objective
## [1] -1.054505
optimize(f3, interval = c(4, 2*pi)) #minimum global
## $minimum
## [1] 5.273383
## 
## $objective
## [1] -2.741405
optimize(f3, interval = c(0, 2*pi), maximum = T) #maksimum lokal
## $maximum
## [1] 4.0598
## 
## $objective
## [1] 1.096473
optimize(f3, interval = c(0, 1.5), maximum = T) #maksimum global
## $maximum
## [1] 0.3323289
## 
## $objective
## [1] 1.485871

Contoh 2 : Mencari nilai minimum dari fungsi \[\mathrm{f(x)} = (x- \frac {1} {3})^2\]

f <- function (x, a) (x - a)^2
xmin <- optimize (f, c(0, 1) , tol = 0.0001 , a = 1/3)
xmin
## $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\]

f4 <-function(x) 4*x^4-2*x^3-3*x
curve(f4, from = -1, to = 1.5)

optim(par = c(-0.5), fn= f4)
## 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)

hasil1$par
## [1] -1.266302  2.028449
hasil2$coefficients
## (Intercept)           x 
##   -1.266667    2.028571
hasil1$value
## [1] 2.819048
sum(hasil2$residuals^2)
## [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
lm(y~x1+x2)
## 
## 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
c( mean (x),sd(x)) # pembanding
## [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