Để 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ư input2
và input3
).
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
.
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
@baptiste: cảm ơn chân thành- Tôi không biết đó là khả thi. –
Tôi thấy cảm ơn bạn đã trả lời chi tiết của bạn! – Enzo