2013-06-09 19 views
5

Giả sử tôi có một hàm được định nghĩa như sauLàm thế nào để giảm thiểu một chức năng hơn một tham số đầu vào trong R

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

và bây giờ tôi muốn giảm thiểu myFunction trên chỉ đầu vào đầu tiên, cụ thể là, input1, trong khi sửa chữa các thông số khác.

Trong R, có vẻ như có một số chức năng được đóng gói sẵn như nlm, optim, v.v. Nhưng tài liệu không thực sự giải thích cách thực hiện vấn đề ở trên. Ví dụ: có vẻ như optim chỉ có thể giảm thiểu một chức năng chỉ trên 1 đầu vào? Tôi có thể sai, nhưng xin vui lòng sửa tôi, và chỉ cho tôi cách được khuyên làm loại vấn đề giảm thiểu này.

Cảm ơn bạn rất nhiều!

Trả lời

5

Để giảm thiểu đầu ra khi đầu vào là vectơ, bạn có thể sử dụng 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 

Đối số đầu tiên để optim (7:10 trong ví dụ của tôi) là giá trị khởi đầu cho input1 (đoán về nơi để bắt đầu tối ưu hóa). Thứ hai là hàm, và sau đó bạn có thể chuyển các tham số cố định (như input2input3).

Trong ví dụ này, số tối thiểu hóa ra là một vectơ chỉ có 3s (vì điều đó giảm thiểu sum(abs(input1 - 3))).


Nếu bạn được thực hiện chỉ một giảm thiểu 1 chiều, bạn sẽ sử dụng optimize chức năng, và vượt qua các đầu vào khác với nó sau khi vượt qua chức năng:

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 

Nếu bạn muốn giảm thiểu Dựa trên input2 hoặc input3 (một đó không phải là đối số đầu tiên đến chức năng), bạn có thể cho những người khác như các đối số được đặt tên:

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 

Nếu bạn đang tự hỏi tại sao điều này là có thể, đó là vì optimize được định nghĩa là:

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

Đó ... cho phép sử dụng bất kỳ số lượng các thông số bổ sung mà nó sau đó sẽ vượt qua để myFunction.

+3

không cần chức năng bổ sung này (currying); bạn chỉ đơn giản có thể vượt qua các đối số thừa thông qua '...': 'o = tối ưu hóa (myFunction, 2, 3, interval = c (-100, 100))' – baptiste

+0

@baptiste: cảm ơn chân thành- Tôi không biết đó là khả thi. –

+0

Tôi thấy cảm ơn bạn đã trả lời chi tiết của bạn! – Enzo

Các vấn đề liên quan