matlab variance of angles

3.7k views Asked by At

I have a matrix containing angles and I need to compute the mean and the variance. for the mean I procede in this way: for each angles compute sin and cos and sum all sin and all cos the mean is given by the atan2(sin, cos) and it works my question is how to compute the variance of angles knowing the mean?

thank you for the answers

I attach my matlab code:

for i=1:size(im2,1)

    for j=1:size(im2,2)
        y=y+sin(hue(i, j));
        x=x+cos(hue(i, j));
    end
end
mean=atan2(y, x);

if mean<0

    mean=mean+(2*pi);
end
4

There are 4 answers

5
Lucas On BEST ANSWER

I am not 100% sure what you are doing, but maybe this would achieve the same thing with the build in MATLAB functions mean and var.

>> [file path] = uigetfile;
>> someImage = imread([path file]);
>> hsv = rgb2hsv(someImage);
>> hue = hsv(:,:,1);
>> m = mean(hue(:))

m =

    0.5249

>> v = var(hue(:))

v =

    0.2074

EDIT: I am assuming you have an image because of your variable name hue. But it would be the same for any matrix.

EDIT 2: Maybe that is what you are looking for:

>> sumsin = sum(sin(hue(:)));
>> sumcos = sum(cos(hue(:)));
>> meanvalue = atan2(sumsin,sumcos)

meanvalue =

    0.5276

>> sumsin = sum(sin((hue(:)-meanvalue).^2));
>> sumcos = sum(cos((hue(:)-meanvalue).^2));
>> variance = atan2(sumsin,sumcos)

variance =

    0.2074
0
chairmanK On

The variance of circular data can not be treated like the variance of unbounded data on the real line. (For very small variances, they are effectively equivalent, but for large variances the equivalence breaks down. It should be clear to you why this is.) I recommend Statistical Analysis of Circular Data by N.I. Fisher. This book contains a widely-used definition of circular variance that is computed from the mean resultant length of the unit vectors that correspond to the angles.

>> sumsin = sum(sin((hue(:)-meanvalue).^2));
>> sumcos = sum(cos((hue(:)-meanvalue).^2));

is wrong. You can't subtract angles like that.

By the way, this question really has nothing to do with MATLAB. You can probably get more/better answers posting on the statistics stack exchange

0
aminrd On

We had the same problem and in python, we could fix that with using scipy.cirvar which computes the circular variance for samples assumed to be in a range. For example:

from scipy.stats import circvar
circvar([0, 2*np.pi/3, 5*np.pi/3])
# 2.19722457734

circvar([0, 2*np.pi])
# -0.0

The problem with the proposed MATLAB code is that the variance of [0, 6.28] should be zero. By looking at the implementation of scipy.circvar it is like:


# Recast samples as radians that range between 0 and 2 pi and calculate the sine and cosine
samples, sin_samp, cos_samp, nmask = _circfuncs_common(samples, high, low)

sin_mean = sin_samp.mean()
cos_mean = cos_samp.mean()

R = np.minimum(1, hypot(sin_mean, cos_mean))
circular_variance = ((high - low)/2.0/pi)**2 * -2 * np.log(R)
0
Mahaveer Jain On

In order to compute variance of an angle you can not use standard variance. This is the formulation to compute var of an angles:

R = 1 - sqrt((sum(sin(angle)))^2 + (sum(cos(angle)))^2)/n;

There is similar other formulation as well:

var(angle) = var(sin(angle)) + var(cos(angle));

Ref: http://www.ebi.ac.uk/thornton-srv/software/PROCHECK/nmr_manual/man_cv.html