Mam następujący kod, w którym chcę znaleźć najlepsze wartości dla x, y i z.

df <- data.frame(replicate(3,sample(0:100,100,rep=TRUE)))

find_best <- function(xyz) {
  x <- xyz[1]
  y <- xyz[2]
  z <- xyz[3]
  nr <- count(df)
  val <- count(df[df[, "X1"] < x & df[, "X2"] < y & df[, "X3"] < z, ] )
  return(val$n/nr$n)
}

optim(par = c(30,15,15), fn = find_best,  lower=c(0,0,0), upper=c(100,100,100), method="L-BFGS-B")

Funkcja nie osiąga w tej chwili zbyt wiele, ale dodam ograniczenia później. Jednak jeśli to uruchomię, otrzymuję tylko wartość początkowych wartości.

$par
[1] 30 15 15

Więc pytanie brzmi, jak mogę uzyskać najlepsze wartości dla x, y, z optim lub z czymkolwiek innym.

0
Hans Geber 13 styczeń 2020, 12:39

1 odpowiedź

Najlepsza odpowiedź

Oto przykład tego, jak możesz użyć optim w swoim celu

set.seed(1)
df <- data.frame(replicate(3,sample(0:100,1e5,rep=TRUE)))

find_best <- function(xyz) {
  x <- xyz[1]
  y <- xyz[2]
  z <- xyz[3]
  r <- nrow(subset(df,X1 < x & X2 < y & X3 < z))/nrow(df)
}

res <- optim(par = c(35,15,15), fn = find_best,  lower=c(0,0,0), upper=c(100,100,100), control = list(fnscale = -1))

Co daje

> res
$par
[1] 35.085 15.205 15.225

$value
[1] 0.00881

$counts
function gradient 
       2        2 

$convergence
[1] 0

$message
[1] "CONVERGENCE: NORM OF PROJECTED GRADIENT <= PGTOL"
1
ThomasIsCoding 13 styczeń 2020, 10:27