3

我有一个包含角度的矩阵,我需要计算均值和方差。对于我以这种方式进行的平均值:对于每个角度计算 sin 和 cos 并对所有 sin 和所有 cos 求和,平均值由 atan2(sin, cos) 给出,我的问题是如何计算角度的方差知道意思是?

谢谢你的回答

我附上我的matlab代码:

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

4 回答 4

4

为了计算角度的方差,您不能使用标准方差。这是计算角度 var 的公式:

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

还有类似的其他公式:

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

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

于 2015-08-21T04:05:43.497 回答
3

我不是 100% 确定你在做什么,但也许这可以通过在 MATLAB 函数meanvar中的构建实现同样的效果。

>> [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

编辑:我假设你有一个图像,因为你的变量 name hue。但是对于任何矩阵都是一样的。

编辑2:也许这就是您要寻找的:

>> 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
于 2011-02-11T13:37:02.160 回答
3

循环数据的方差不能像实线上无界数据的方差一样对待。(对于非常小的方差,它们实际上是等价的,但对于大的方差,等价性就会失效。你应该很清楚为什么会这样。)我推荐NI Fisher的 Statistical Analysis of Circular Data。本书包含一个广泛使用的循环方差定义,该定义是根据与角度对应的单位向量的平均合成长度计算得出的。

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

是错的。你不能像这样减去角度。

顺便说一句,这个问题真的与MATLAB无关。您可能会在统计堆栈交换中获得更多/更好的答案

于 2011-02-12T03:48:20.957 回答
0

我们遇到了同样的问题,在 python 中,我们可以通过使用scipy.cirvar计算假设在一个范围内的样本的循环方差来解决这个问题。例如:

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

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

所提出的 MATLAB 代码的问题是 的方差[0, 6.28]应该为零。通过查看scipy.circvar它的实现就像:


# 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)
于 2021-05-13T20:15:14.653 回答