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)\]
rosenbrock <- function(par){
x <- par[1]
y <- par[2]
(1-x)^2 + 100*(y-x^2)^2
}
start <- c(-2,2)
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
res_bfgs <- optim(start, rosenbrock, method="BFGS")
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?
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.
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)\).
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)\)
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
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)
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)]\]
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))
}
start <- c(0,0)
res <- optim(start, nll, method="BFGS")
res$par
## [1] -0.996138 2.026173
glmmodel <- glm(y~x, family=binomial)
coef(model)
## (Intercept) x
## -0.9961379 2.0261734
Coba jawablah pertanyaan-pertanyaan berikut:
Mengapa regresi logistik tidak memiliki solusi analitik seperti regresi linear?
Apa yang terjadi jika nilai awal parameter diubah menjadi: \((5,5)\) atau \((-5,-5)\) ? Apakah hasil estimasi berubah?
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?