2013-06-09 45 views
5

Supponiamo Ho una funzione definita come seguendoCome minimizzare una funzione in un parametro di input in R

myFunction = function(input1, input2, input3) { 
    # do something with input and then return 
} 

e ora voglio minimizzare myFunction sopra solo il primo ingresso, vale a dire, input1, mentre fissa gli altri parametri.

In R, sembra che ci siano alcune funzioni preconfezionate come nlm, optim, ecc. Ma la documentazione in realtà non spiega come risolvere il problema sopra. Ad esempio, sembra che optim possa minimizzare solo una funzione su un solo input? Probabilmente ho torto, ma per favore correggimi e mostrami il modo consigliato di fare questo tipo di problema minimizzante.

Grazie mille!

risposta

5

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.

+3

nessuna necessità di questa funzione extra (currying); puoi semplicemente passare gli argomenti extra attraverso '...': 'o = optimize (myFunction, 2, 3, interval = c (-100, 100))' – baptiste

+0

@baptiste: sincero ringraziamento- non sapevo che fosse possibile. –

+0

Vedo grazie per la tua risposta dettagliata! – Enzo