Date: Feb 27, 2013 5:44 PM
Author: Tony Kittler
Subject: Re: Alternative solution for NAN

"Steven_Lord" <slord@mathworks.com> wrote in message <kgldag$ir9$1@newscl01ah.mathworks.com>...
>
>
> "Carl S." <tkittler@gmail.com> wrote in message
> news:kgkurb$1t8$1@newscl01ah.mathworks.com...

> > "Torsten" wrote in message <kgku2t$t2g$1@newscl01ah.mathworks.com>...
>
> *snip*
>

> >> The matrix N you get after the while loop is a scalar multiple of the
> >> identity matrix and in general has nothing in common with your original
> >> matrix N. You will have to find out why eig produces NaN values for your
> >> original matrix N. Are you sure all elements of N are finite ? Best
> >> wishes
> >> Torsten.

> >
> > Yes, Torsten, they are finite
> >
> > My goal is to fit means(mu) and standard deviations(N) to Gaussian shape.
> > The codes that I wrote above are from the function ;
> >
> > function res=MultivariateGaussianPDF(x,mu,N)
> > while(det(N) == 0)

>
> 1) Don't use DET to test for singularity. This matrix:
>
> A = 1e-10*eye(400);
>
> has determinant 0 (due to underflow) but it's a scaled identity matrix,
> which is about as well-behaved as you can get. If you _must_ test for
> singularity, check with COND or RCOND.
>
> 2) Don't test a floating-point number for exact, bit-for-bit equality unless
> you need exact, bit-for-bit equality. Compare with a tolerance instead.
>

> > N=(1e-10.*randi(1,size(N)))*eye(size(N));
> > end
> >
> > [M,d]=size(x);
> > [U,D]=eig(N); % <=causes NAN problem :((

>
> Show the group a SMALL matrix N with which you can reproduce this behavior.
>
> *snip*
>
> 3) If you have Statistics Toolbox, do one of these functions do what you
> want?
>
> http://www.mathworks.com/help/stats/multivariate-normal-distribution-1.html
>
> http://www.mathworks.com/help/stats/normal-distribution-1.html
>
> If not, please explain more _in words not code or equations_ specifically
> what you mean/are trying to do when you say you want to fit means and
> standard deviations to a Gaussian shape.
>
> --
> Steve Lord
> slord@mathworks.com
> To contact Technical Support use the Contact Us link on
> http://www.mathworks.com


Thanks Steven and Torsten,
(It is difficult to prepare a small group of matrix N. I am trying to find likelihood of an image. Codes are working for many images, but gives this NAN error for some of them)
I examined all codes again and saw that the error is due to the non-positive definite values of N. So, I wrote that

[U,D]= chol(N);
if D ~= 0 % <= if N not positive definite
positivedefiniteN = topdm(N); %<=topdm converts N to a positive definite matrix
[U,D]= chol(positivedefiniteN );
end

(For topdm function, the link is http://www.mathworks.com/matlabcentral/fileexchange/35938-converts-a-non-positive-definite-symmetric-matrix-to-positive-definite-symmetric-matrix/content/topdm.m)

But, the value of D returns zero therefore
W=sqrt(inv(D))*U;
returns NAN and inf values, since, inv(D)=inf
:((

I have tried this
nonsingularD = pinv(D);
but nonsingularD is equal to zero, so it does not solve this problem