Aby zminimalizować wyjście, gdy dane wejściowe są wektorem, można użyć wartości optim
.
myFunction = function(input1, input2, input3) sum(abs(input1 - 3))
o = optim(7:10, myFunction, input2=5, input3=6)
o$par
# [1] 2.999989 2.999995 3.000000 3.000001
Pierwszym argumentem optim
(7:10
w moim przykładzie) to wartość początkowa dla input1
(przypuszczenie od czego zacząć optymalizacji). Druga to funkcja, a następnie można przekazać określone parametry (takie jak input2
i input3
).
W tym przykładzie minimalna okazuje się być wektorem tylko 3s (jako że minimalizuje sum(abs(input1 - 3))
).
Jeśli wykonywali tylko 1-wymiarową minimalizacji, należy użyć funkcji optimize
i przekazać innym wejść do niego po przejściu przez funkcję:
myFunction = function(input1, input2, input3) {
return(abs(input1 - 3) + input2 + input3)
}
o = optimize(myFunction, 2, 3, interval=c(-100, 100))
print(o$minimum)
# [1] 3.000003
Jeśli chcesz zminimalizować Based na input2
lub input3
(jeden, że nie jest to pierwszy argument funkcji), można dać innym jako nazwane argumenty:
myFunction = function(input1, input2, input3) {
return(abs(input1 - 3) + abs(input2 - 12) + input3)
}
print(optimize(myFunction, input1=2, input3=3, interval=c(-100, 100)))
print(o$minimum)
[1] 11.99998
Jeśli zastanawiasz się, dlaczego jest to możliwe, to dlatego optimize
jest zdefiniowany jako:
function (f, interval, ..., lower = min(interval), upper = max(interval),
maximum = FALSE, tol = .Machine$double.eps^0.25)
To ...
umożliwia korzystanie z dowolnej liczby dodatkowych parametrów, które będzie następnie przekazać do myFunction
.
nie ma potrzeby korzystania z tej dodatkowej funkcji (curry); możesz po prostu przekazać dodatkowe argumenty przez '...': 'o = optimize (myFunction, 2, 3, interval = c (-100, 100))' – baptiste
@baptiste: serdeczne dzięki - nie wiedziałem, że było możliwy. –
Dziękuję za szczegółową odpowiedź! – Enzo