[Insight-users] Re: Using KalmanLinearEstimator
Mathieu Malaterre
mathieu.malaterre at gmail.com
Mon May 7 11:55:38 EDT 2007
As usual Luis thanks a bunch for your help. I will look into your suggestion.
just for reference I was able to get a correct approximate solution by doing:
for(unsigned int duplicate = 0; duplicate < 100000; ++duplicate)
for(unsigned int ax=0; ax < N; ax++)
{
predictor(0) = points[ax][0];
measure = points[ax][1];
//std::cout << predictor(0) << "," << measure << std::endl;
filter.UpdateWithNewMeasure(measure,predictor);
}
If you plot the values using excel or gnuplot you can see the linear
regression is pretty obvious. Anyway I do not know enough about Kalman
algorithm.
Thanks
-Mathieu
On 5/7/07, Luis Ibanez <luis.ibanez at kitware.com> wrote:
>
> Hi Mathieu,
>
>
> 1) Do you have only 6 data points in your real problem ?
>
> They may not be enough data for bringing the
> Kalman Estimator to convergence to a good
> estimation.
>
> I was assuming that you had in the order
> of hundreds to thousands of values.
>
>
> 2) You may find useful to print out the estimations
> as you go adding new points. One of the interesting
> advantages of the Kalman estimator is that it
> provides at estimation using the currently provided
> samples.
>
> E.g., move the line:
>
> > VectorType estimation = filter.GetEstimator();
>
> inside the for loop and print out the value of
> the estimation. Then you will see how it get
> close to the [A,B] values.
>
> Note that the estimator is initialized with [0,0]
> so it may take a while (many measurement) to shift
> the estimation to your real A,B values.
>
> Maybe we should add a method to initialize the
> Estimator to a known value. In this way, the
> Kalman estimator would focus on refining the
> estimation.
>
>
>
> Regards,
>
>
> Luis
>
>
> -------------------------
> Mathieu Malaterre wrote:
> > Hello,
> >
> > I must be something obviously really wrong when using the
> > KalmanLinearEstimator class, because the results are way off. Could
> > someone please help find the obvious mistake I must have done.
> >
> > thanks !
> > -Mathieu
> >
> > Code is:
> >
> > #include "itkKalmanLinearEstimator.h"
> > #include <iostream>
> >
> > int main(int, char* [] )
> > {
> > typedef itk::KalmanLinearEstimator<double,2> KalmanFilterType;
> >
> > typedef KalmanFilterType::VectorType VectorType;
> > typedef KalmanFilterType::MatrixType MatrixType;
> > typedef KalmanFilterType::ValueType ValueType;
> >
> > KalmanFilterType filter;
> >
> > filter.ClearEstimation();
> > filter.SetVariance(1.0);
> >
> > ValueType measure;
> > VectorType predictor;
> >
> > // A ~ 0.323
> > // B ~ 172.4
> > const double points[][2] = {
> > {-16.6817,167.095},
> > {-44.4257,158.118},
> > {-68.0884,150.462},
> > {-87.7176,144.111},
> > {-103.447,139.021},
> > {-115.437,135.142},
> > };
> > const unsigned int N = sizeof(points) / ( 2 * sizeof( double ));
> >
> > predictor(1) = 1.0;
> > for(unsigned int ax=0; ax < N; ax++)
> > {
> > predictor(0) = points[ax][0];
> > measure = points[ax][1];
> > //std::cout << predictor(0) << "," << measure << std::endl;
> > filter.UpdateWithNewMeasure(measure,predictor);
> > }
> >
> > VectorType estimation = filter.GetEstimator();
> >
> > std::cout << std::endl << "The Estimation is : " << std::endl;
> > std::cout << estimation;
> >
> > std::cout << std::endl << std::endl;
> > return EXIT_SUCCESS;
> > }
> >
> >
> > On 5/6/07, Luis Ibanez <luis.ibanez at kitware.com> wrote:
> >
> >>
> >> Hi Mathieu,
> >>
> >> You may want to try the KalmanLinearEstimator.
> >>
> >> http://www.itk.org/Insight/Doxygen/html/classitk_1_1KalmanLinearEstimator.html
> >>
> >>
> >>
> >> Your estimator will be the vector [a,b],
> >>
> >> and your measures will be the vector [1,Y]
> >>
> >>
> >> The Kalman Linear Estimator should converge to the vector [a,b] that
> >> minimizes the sum of squared errors between X and (a+bY).
> >>
> >> For an example, you may want to look at:
> >>
> >>
> >>
> >> Insight/Testing/Code/Algorithms/
> >> itkKalmanLinearEstimatorTest.cxx
> >>
> >>
> >>
> >> Regards,
> >>
> >>
> >> Luis
> >>
> >>
> >> ---------------------------
> >> Mathieu Malaterre wrote:
> >> > Hello,
> >> >
> >> > I have a pretty simple problem to solve and I was wondering if I
> >> > could reuse any brick already existing in ITK.
> >> >
> >> > I am working with a 4D dataset (x,y,y and theta), where I can
> >> > express for each pixel that:
> >> >
> >> > I(x,y,z)/sin(theta) = F(x,y,z) + b*I(x,y,z)/tan(theta)
> >> >
> >> > My goal here is to find out the b constant, I do not need the
> >> > F(x,y,z) part. Obvisouly all I need to do is draw the line
> >> >
> >> > X = a + b Y
> >> >
> >> > where X = I(x,y,z)/sin(theta) and Y = I(x,y,z)/tan(theta) and the
> >> > slope will give me 'b'.
> >> >
> >> > Any suggestions on which class to reuse ?
> >> > thanks !
> >>
> >
> >
>
--
Mathieu
Tel: +33 6 32 13 33 40
More information about the Insight-users
mailing list