2013-06-09 12 views
5

Załóżmy, że mam funkcję, która jest zdefiniowana jako następująceJak zminimalizować funkcję w ciągu jednego parametru wejściowego w R

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

i teraz chcę, aby zminimalizować myFunction ciągu tylko pierwszego wejścia, a mianowicie input1, podczas ustalania pozostałe parametry.

W R, wydaje się, że istnieje kilka funkcji pakowanych, takich jak nlm, optim, itp. Ale dokumentacja tak naprawdę nie wyjaśnia, jak rozwiązać powyższy problem. Na przykład wygląda na to, że optim może zminimalizować tylko funkcję tylko na 1 wejściu? Prawdopodobnie jestem w błędzie, ale proszę, popraw mnie i pokaż mi zalecany sposób robienia tego rodzaju problemu minimalizującego.

Dziękuję bardzo!

Odpowiedz

5

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.

+3

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

+0

@baptiste: serdeczne dzięki - nie wiedziałem, że było możliwy. –

+0

Dziękuję za szczegółową odpowiedź! – Enzo

Powiązane problemy