Hi Gilles,
Looks good to me. It is the explicit update now. I would like to propose
different names for the new function:
"applyConstraints()" or "renormalize()"
Thanks,
Olexiy
-----Original Message-----
From: Gilles [mailto:[email protected]]
Sent: Monday, September 08, 2014 3:11 AM
To: [email protected]
Subject: Re: [math] Side effect of LevenbergMarquardtOptimizer
On Thu, 4 Sep 2014 12:52:24 -0400, Evan Ward wrote:
> Hi Olexiy,
>
> In my field we often encounter a similar problem when estimating
> attitude since a quaternion is only a valid rotation when it is
> normalized. We often escape this issue by estimating a "small"
> adjustment to an apriori guess. (For the details see [1].) For this
> technique to work the cost function must be smooth and the apriori
> guess must be "close enough" to the true value. Both of these
> assumptions are also required to apply a non-linear least squares
> optimizer. Perhaps you can apply a similar technique to your problem.
> (It seems that your 'A'
> parameter is orientation in 3D space.)
>
> If there is a need for an extra steps, I would prefer to make those
> explicit rather than depending on side effects of cost function
> evaluation.
IIUC, the feature could be made explicit by adding a method to the
"MultivariateJacobianFunction" interface to allow the user to change the point
about to be evaluated:
interface MultivariateJacobianFunction {
Pair<RealVector, RealMatrix> value(RealVector point);
/** @param point Point provided by the optimizer. */
/** @return the point that will actually be evaluated. */
RealVector validate(RealVector point); }
Thus, in "LeastSquaresFactory":
private static class LocalLeastSquaresProblem
extends AbstractOptimizationProblem<Evaluation>
implements LeastSquaresProblem {
// ...
private final MultivariateJacobianFunction model;
// ...
public Evaluation evaluate(final RealVector point) {
final RealVector p = model.validate(point).copy(); // <--- Change here
(at line 403).
if (lazyEvaluation) {
return new LazyUnweightedEvaluation(model,
target,
p);
} else {
final Pair<RealVector, RealMatrix> value = model.value(p);
return new UnweightedEvaluation(value.getFirst(),
value.getSecond(),
target,
p);
}
}
// ...
}
What do you think?
Best,
Gilles
>
> Best Regards,
> Evan
>
> [1] Crassidis, John L., and John L. Junkins. /Optimal Estimation of
> Dynamic Systems/. Boca Raton, FL: CRC, 2012.
>
> On 09/04/2014 05:37 AM, Olexiy Movchan wrote:
>> Hello,
>>
>> I created the math issue
>> https://issues.apache.org/jira/browse/MATH-1144.
>>
>> In version 2.0, LevenbergMarquardtOptimizer passed point to evaluator
>> by reference. So our software could modify it on every step of
>> algorithm.
>> In version 3.3, point is copied and then passed to evaluator, so it
>> can't be updated by evaluator.
>>
>> We use LevenbergMarquardtOptimizer for 3d surface fitting (cylinders,
>> cones, tori) by sampled points. And surface parameters should be
>> renormalized on every step of algorithm. Please see this
>> article:
>>
>> http://nvlpubs.nist.gov/nistpubs/jres/103/6/j36sha.pdf
>>
>> Also please read the description of MATH-1144 jira issue.
>>
>> Can you modify optimizer or evaluator interface to allow in/out
>> parameters there?
>>
>> Thanks,
>> Olexiy Movchan
>>
>>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]