2013-06-09 3 views
5

nehme ich eine Funktion haben, zu minimieren, die wie folgtWie eine Funktion über einen Eingabeparameter in R

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

und jetzt will I definiert ist myFunction nur über den ersten Eingang zu minimieren, nämlich input1, während Festsetzung die anderen Parameter.

In R scheint es, dass es einige vorkompilierte Funktionen wie nlm, optim usw. gibt. Aber die Dokumentation erklärt nicht wirklich, wie man das Problem oben tut. Zum Beispiel scheint es, dass optim nur eine Funktion über nur 1 Eingang minimieren kann? Ich bin wahrscheinlich falsch, aber bitte korrigieren Sie mich, und zeigen Sie mir die empfohlene Art, diese Art von Minimierung Problem zu tun.

Vielen Dank!

Antwort

5

Um die Ausgabe zu minimieren, wenn die Eingabe ein Vektor ist, können Sie optim verwenden.

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 

Das erste Argument für optim (7:10 in meinem Beispiel) ist der Startwert für input1 (eine Vermutung, wo die Optimierung zu starten). Die zweite ist die Funktion, und Sie können dann die festen Parameter übergeben (wie input2 und input3).

In diesem Beispiel stellt sich das Minimum als ein Vektor von nur 3s dar (das minimiert sum(abs(input1 - 3))).


Wenn Sie gerade eine 1-dimensionale Minimierung durchgeführt wird, würden Sie die optimize Funktion verwenden und die anderen Eingänge, um es passieren, nachdem die Funktion übergeben:

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 

Wenn Sie ZUGRUNDELEGUNG minimieren wollen auf input2 oder input3 (eine, die nicht das erste Argument der Funktion ist), können Sie die anderen als benannte Argumente geben:

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 

Wenn Sie sich fragen, warum dies möglich ist, ist es, weil optimize ist definiert als:

function (f, interval, ..., lower = min(interval), upper = max(interval), 
      maximum = FALSE, tol = .Machine$double.eps^0.25) 

Die ... die Verwendung einer beliebigen Anzahl von zusätzlichen Parametern erlaubt, die es dann zu myFunction passieren.

+3

keine Notwendigkeit für diese zusätzliche Funktion (Curry); Sie können einfach die zusätzlichen Argumente durch '...': 'o = optimieren (myFunction, 2, 3, interval = c (-100, 100))' – baptiste

+0

@baptiste: aufrichtig danke- Ich war mir nicht bewusst, dass das war möglich. –

+0

Ich danke Ihnen für Ihre ausführliche Antwort! – Enzo