1. Ilustrasi optimisasi menggunakan R

Misalnya kita ingin meminimumkan suatu fungsi berikut. \[f(x, y) = (1 - x)^{2} + 100(y - x^{2})^{2}\] Fungsi ini dikenal sebagai Rosenbrock function, dan sering digunakan sebagai benchmark optimisasi, dengan nilai minimum global adalah sebagai berikut. \[(x,y)=(1,1)\]

1.1 Mendefinisikan fungsi di R

rosenbrock <- function(par){

  x <- par[1]
  y <- par[2]

  (1-x)^2 + 100*(y-x^2)^2
}

1.2 Menentukan nilai awal

start <- c(-2,2)

1.3 Melakukan optimisasi dengan metode Conjugate Gradient

res_cg <- optim(start, rosenbrock, method="CG")
res_cg
## $par
## [1] 1.024317 1.049297
## 
## $value
## [1] 0.0005896735
## 
## $counts
## function gradient 
##      410      101 
## 
## $convergence
## [1] 1
## 
## $message
## NULL
  • Perhatikan objek res_cg. Berapa banyak komponen yang terdapat dalam objek tersebut?
  • Perhatikan komponen par. Apa arti nilai yang terdapat pada komponen ini?
  • Apakah nilai tersebut sesuai dengan titik minimum yang Anda harapkan dari fungsi yang dioptimisasi?
  • Perhatikan komponen value. Apa arti nilai ini dalam konteks optimisasi?
  • Jika optimisasi berhasil menemukan minimum global, berapa kira-kira nilai yang Anda harapkan dari komponen ini?
  • Perhatikan komponen counts. Apa yang ditunjukkan oleh nilai function dan gradient?
  • Apakah jumlah evaluasi ini sama jika Anda menggunakan metode optimisasi yang berbeda?

1.4 Melakukan optimisasi dengan metode Quasi-Newton (BFGS)

res_bfgs <- optim(start, rosenbrock, method="BFGS")

1.5 Melakukan optimisasi dengan metode Newton

res_newton <- nlm(rosenbrock, start)

Di antara metode-metode yang Anda coba, metode manakah yang memerlukan iterasi paling sedikit? Apakah semua metode menemukan nilai minimum yang sama?

2. Latihan

2.1 Mengidentifikasi pengaruh perbedaan nilai awal

Gunakan fungsi yang sama. \[f(x, y) = (1 - x)^{2} + 100(y - x^{2})^{2}\] Gunakan tiga nilai awal:

  • (-2,2)

  • (2,2)

  • (-1,-1)

Untuk setiap nilai awal, lakukan optimisasi menggakan metode Conjugate Gradient, Quasi-Newton (BFGS), dan Newton.

Selanjutnya, perhatikan dan catat titik optimum dan jumlah iterasinya.

2.2 Melakukan optimisasi pada fungsi konveks

Misalnya didefinisikan suatu fungsi sebagai berikut. \[f(x, y) = (x - 2)^{2} + (y + 1)^{2}\] Tentukan titik optimum fungsi tersebut jika digunakan nilai awal \((5,5)\).

2.3 Melakukan optimisasi pada fungsi dengan banyak local minimum

Misalnya didefinisikan suatu fungsi sebagai berikut. \[f(x, y) = x^{2} + y^{2}+sin(5x) cos(5y)\] Berikut code untuk mendefinisikan dulu fungsinya di R.

f_obj <- function(x, y){
  x^2 + y^2 + sin(5*x)*cos(5*y)
}

Selanjutnya, semisal kita ingin melihat dulu bentuk fungsinya secara visual.

library(plotly)
## Loading required package: ggplot2
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
x <- seq(-3,3,length=100)
y <- seq(-3,3,length=100)

plot_ly(
  x = x,
  y = y,
  z = outer(x,y,f_obj),
  type = "surface"
)
library(ggplot2)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
x <- seq(-3,3,length=200)
y <- seq(-3,3,length=200)

grid <- expand.grid(x=x,y=y)
grid$z <- with(grid, f_obj(x,y))

ggplot(grid, aes(x, y, z=z)) +
  geom_contour_filled() +
  scale_fill_viridis_d() +
  labs(
    title = "Kontur Berwarna Fungsi Objektif",
    x = "x",
    y = "y"
  ) +
  theme_minimal()

Lakukan optimisasi dengan nilai awal berikut: - \((-2, -2)\) - \((1, 1)\) - \((2, -1)\)

3. Penerapan optimisasi pada pemodelan regresi logistik

Dalam regresi linear, parameter dapat diperoleh dengan solusi analitik. Namun pada regresi logistik, parameter biasanya diperoleh dengan optimisasi numerik, karena tidak ada solusi tertutup.

Kita ingin mengestimasi parameter: \[\beta = (\beta_0, \beta_1)\] pada model berikut ini.

\[P(Y=1|x) = \frac{1}{1 + \exp[-(\beta_0 + \beta_1 x)]}\] Parameter diperoleh dengan memaksimumkan likelihood atau meminimumkan negative log-likelihood.

Metode gradien digunakan untuk mencari nilai parameter yang meminimumkan fungsi tersebut, melalui proses iterasi menuju titik optimum

3.1 Simulasi Data

set.seed(123)

n <- 100

x <- rnorm(n)

beta0 <- -1
beta1 <- 2

p <- 1/(1+exp(-(beta0 + beta1*x)))

y <- rbinom(n,1,p)

data <- data.frame(x,y)

3.2 Bentuk model logistik

Peluang kejadian dapat didefinisikan sebagai berikut. \[p_i = \frac{1}{1 + \exp[-(\beta_0 + \beta_1 x_i)]}\] Fungsi likelihood dapat dituliskan sebagai berikut. \[L(\beta) = \prod_{i=1}^{n} p_i^{y_i} (1-p_i)^{1-y_i}\] Selanjutnya, kita dapat menyatakannya dalam bentuk log berikut. \[\ell(\beta) = -\sum_{i=1}^{n} [y_i \log(p_i) + (1 - y_i) \log(1 - p_i)]\]

3.3 Mendefinisikan fungsi Loss di R

nll <- function(beta){

  b0 <- beta[1]
  b1 <- beta[2]

  p <- 1/(1+exp(-(b0 + b1*x)))

  -sum(y*log(p) + (1-y)*log(1-p))
}

3.4 Menduga parameter dengan optimisasi

start <- c(0,0)

res <- optim(start, nll, method="BFGS")

res$par
## [1] -0.996138  2.026173

3.5 Membandingkan dengan fungsi glm

model <- glm(y~x, family=binomial)

coef(model)
## (Intercept)           x 
##  -0.9961379   2.0261734

Coba jawablah pertanyaan-pertanyaan berikut:

  1. Mengapa regresi logistik tidak memiliki solusi analitik seperti regresi linear?

  2. Apa yang terjadi jika nilai awal parameter diubah menjadi: \((5,5)\) atau \((-5,-5)\) ? Apakah hasil estimasi berubah?

  3. Jalankan optimisasi dengan metode Conjugate Gradient (method="CG") dan Quasi-Newton (method="BFGS"). Bandingkan jumlah iterasi dan nilai minimum fungsi. Metode mana yang lebih efisien?