[Insight-users] Re: Using KalmanLinearEstimator
Luis Ibanez
luis.ibanez at kitware.com
Mon May 7 11:49:08 EDT 2007
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 !
>>
>
>
More information about the Insight-users
mailing list