[R] optimize integer function parameters
Enrico Schumann
es at enricoschumann.net
Tue Jul 23 17:27:46 CEST 2013
On Tue, 23 Jul 2013, Christof Kluß <ckluss at email.uni-kiel.de> writes:
> Am 23-07-2013 13:20, schrieb Enrico Schumann:
>
>> On Tue, 23 Jul 2013, Christof Kluß <ckluss at email.uni-kiel.de> writes:
>>
>>>
>>> I have "observations" obs <- (11455, 11536, 11582, 11825, 11900, ...)
>>>
>>> and a simulation function f(A,B,C,D,E,F), so sim <- f(A,B,C,D,E,F)
>>>
>>> e.g. sim = c(11464, 11554, 11603, 11831, 11907, ...)
>>>
>>> now I would like to fit A,B,C,D,E,F such that "obs" and f(A,B,C,D,E,F)
>>> match as well as possible. A,..,F should be integers and have bounds.
>>>
>>> How would you solve this problem without bruteforce in an acceptable time?
>>>
>>
>>
>> That depends on what your "simulation function" looks like. Could you
>> post a (small) self-contained example?
>>
>>
>
> the integer values in the vectors sim and obs are dates
>
> when I set sim <- f(TS0,TS1,TS2,TB0,TB1,TB2) my A,..,F below
> then TS0 and TB0 are depend (and so on)
>
>
> the main thing in f(...) is something like
>
> for (i in c(1:length(temperature))) {
> Temp <- temperature[i]
> if (DS < 0) {
> DS <- DS + max(Temp-TB0,0) / TS0
> } else if (DS < 1) {
> ... date0 <- i
> DS <- DS + max(Temp-TB1,0) / TS1
> } else if (DS < 2) {
> ... date1 <- i
> DS <- DS + max(Temp-TB2,0) / TS2
> } else {
> ... date2 <- i
> break
> }
> }
>
>
> this produced a vector sim = c(date0,date1,date2,...)
>
>
> now I would like to minimize RMSE(sim,obs) or something like that
>
> thx
> Christof
>
>
>
> for brute force I would do something like
>
> obs <- ...
> act <- 1000
>
> for (TS0 in seq(50,100,10))
> for (TS1 in seq(750,850,10))
> for (TS2 in seq(400,600,10))
> for (TB0 in c(5:7))
> for (TB1 in c(5:7))
> for (TB2 in c(4:9)) {
> sim <- foosim(dat,TS0,TS1,TS2,TB0,TB1,TB2)
> rmse <- sqrt(mean((sim - obs)^2, na.rm = TRUE))
>
> if (rmse < act) {
> print(paste(rmse,TS0,TS1,TS2,TB0,TB1,TB2))
> act <- rmse
> }
> }
>
Sorry, but that is not what I meant by "a (small) self-contained
example".
In any case, if brute force is feasible -- ie, your function can be
evaluated quickly enough and there are no further parameters -- then why
not do brute force? (In the NMOF package there is a function
'gridSearch' that allows you to distribute the function evaluations.
Disclosure: I am the package author.)
If that does not work, you might try a Local Search or one of its
variants (see for instance 'LSopt' in the NMOF package). But it is
difficult to say anything specific without knowing your actual function.
Regards,
Enrico
--
Enrico Schumann
Lucerne, Switzerland
http://enricoschumann.net
More information about the R-help
mailing list