Per ridurre al minimo l'output quando l'input è un vettore, è possibile utilizzare 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
Il primo argomento optim
(7:10
nel mio esempio) è il valore di partenza per input1
(un'ipotesi di dove cominciare l'ottimizzazione). Il secondo è la funzione e puoi quindi passare i parametri fissi (come input2
e input3
).
In questo esempio, il minimo risulta essere un vettore di soli 3 s (in questo modo viene ridotto al minimo sum(abs(input1 - 3))
).
Se si stava eseguendo solo una minimizzazione 1-dimensionale, si può usare la funzione optimize
, e superare gli altri ingressi ad esso dopo aver superato la funzione:
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
Se si vuole ridurre al minimo Based su input2
o input3
(uno che non è il primo argomento della funzione), si può dare anche gli altri argomenti con nome:
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
Se vi state chiedendo il motivo per cui questo è possibile, è perché optimize
è definito come:
function (f, interval, ..., lower = min(interval), upper = max(interval),
maximum = FALSE, tol = .Machine$double.eps^0.25)
Che ...
consente l'uso di qualsiasi numero di parametri aggiuntivi che sarà poi passare ad myFunction
.
nessuna necessità di questa funzione extra (currying); puoi semplicemente passare gli argomenti extra attraverso '...': 'o = optimize (myFunction, 2, 3, interval = c (-100, 100))' – baptiste
@baptiste: sincero ringraziamento- non sapevo che fosse possibile. –
Vedo grazie per la tua risposta dettagliata! – Enzo