[R] Dealing with -Inf in a maximisation problem.
Martin Maechler
maechler at stat.math.ethz.ch
Mon Nov 7 12:08:23 CET 2016
>>>>> William Dunlap via R-help <r-help at r-project.org>
>>>>> on Sun, 6 Nov 2016 20:53:17 -0800 writes:
> Perhaps the C function Rf_logspace_sum(double *x, int n) would help in
> computing log(b). It computes log(sum(exp(x_i))) for i in 1..n, avoiding
> unnecessary under- and overflow.
Indeed!
I had thought more than twice to also export it to the R level
notably as we have been using two R level versions in a package
I maintain ('copula'). They are vectorized there in a way that
seemed particularly useful to our (Marius Hofert and my) use cases.
More on this -- making these available in R, how exactly? --
probably should move to the R-devel list.
Thank you Bill for bringing it up!
Martin
> Bill Dunlap
> TIBCO Software
> wdunlap tibco.com
> On Sun, Nov 6, 2016 at 5:25 PM, Rolf Turner <r.turner at auckland.ac.nz> wrote:
>> On 07/11/16 13:07, William Dunlap wrote:
>>
>>> Have you tried reparameterizing, using logb (=log(b)) instead of b?
>>>
>>
>> Uh, no. I don't think that that makes any sense in my context.
>>
>> The "b" values are probabilities and must satisfy a "sum-to-1"
>> constraint. To accommodate this constraint I re-parametrise via a
>> "logistic" style parametrisation --- basically
>>
>> b_i = exp(z_i)/[sum_j exp(z_j)], j = 1, ... n
>>
>> with the parameters that the optimiser works with being z_1, ..., z_{n-1}
>> (and with z_n == 0 for identifiability). The objective function is of the
>> form sum_i(a_i * log(b_i)), so I transform back
>> from the z_i to the b_i in order calculate the value of the objective
>> function. But when the z_i get moderately large-negative, the b_i become
>> numerically 0 and then log(b_i) becomes -Inf. And the optimiser falls over.
>>
>> cheers,
>>
>> Rolf
>>
>>
>>> Bill Dunlap
>>> TIBCO Software
>>> wdunlap tibco.com <http://tibco.com>
>>>
>>> On Sun, Nov 6, 2016 at 1:17 PM, Rolf Turner <r.turner at auckland.ac.nz
>>> <mailto:r.turner at auckland.ac.nz>> wrote:
>>>
>>>
>>> I am trying to deal with a maximisation problem in which it is
>>> possible for the objective function to (quite legitimately) return
>>> the value -Inf, which causes the numerical optimisers that I have
>>> tried to fall over.
>>>
>>> The -Inf values arise from expressions of the form "a * log(b)",
>>> with b = 0. Under the *starting* values of the parameters, a must
>>> equal equal 0 whenever b = 0, so we can legitimately say that a *
>>> log(b) = 0 in these circumstances. However as the maximisation
>>> algorithm searches over parameters it is possible for b to take the
>>> value 0 for values of
>>> a that are strictly positive. (The values of "a" do not change during
>>> this search, although they *do* change between "successive searches".)
>>>
>>> Clearly if one is *maximising* the objective then -Inf is not a value
>>> of
>>> particular interest, and we should be able to "move away". But the
>>> optimising function just stops.
>>>
>>> It is also clear that "moving away" is not a simple task; you can't
>>> estimate a gradient or Hessian at a point where the function value
>>> is -Inf.
>>>
>>> Can anyone suggest a way out of this dilemma, perhaps an optimiser
>>> that is equipped to cope with -Inf values in some sneaky way?
>>>
>>> Various ad hoc kludges spring to mind, but they all seem to be
>>> fraught with peril.
>>>
>>> I have tried changing the value returned by the objective function
>>> from
>>> "v" to exp(v) --- which maps -Inf to 0, which is nice and finite.
>>> However this seemed to flatten out the objective surface too much,
>>> and the search stalled at the 0 value, which is the antithesis of
>>> optimal.
>>>
>>> The problem arises in a context of applying the EM algorithm where
>>> the M-step cannot be carried out explicitly, whence numerical
>>> optimisation.
>>> I can give more detail if anyone thinks that it could be relevant.
>>>
>>> I would appreciate advice from younger and wiser heads! :-)
>>>
>>> cheers,
>>>
>>> Rolf Turner
>>>
>>> --
>>> Technical Editor ANZJS
>>> Department of Statistics
>>> University of Auckland
>>> Phone: +64-9-373-7599 ext. 88276 <tel:%2B64-9-373-7599%20ext.%2
088276>
>>>
>>> ______________________________________________
>>> R-help at r-project.org <mailto:R-help at r-project.org> mailing list --
>>> To UNSUBSCRIBE and more, see
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> <https://stat.ethz.ch/mailman/listinfo/r-help>
>>> PLEASE do read the posting guide
>>> http://www.R-project.org/posting-guide.html
>>> <http://www.R-project.org/posting-guide.html>
>>> and provide commented, minimal, self-contained, reproducible code.
>>>
>>>
>>>
>>
>> --
>> Technical Editor ANZJS
>> Department of Statistics
>> University of Auckland
>> Phone: +64-9-373-7599 ext. 88276
>>
> [[alternative HTML version deleted]]
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
More information about the R-help
mailing list