2014-03-03 188 views
5

我一直在试图解决一个问题。我很惊讶,我一直无法找到网上真正有用的东西。椭圆的协方差矩阵

我知道从椭圆的协方差矩阵的特征值可以计算出椭圆的主轴和副轴。如下所示:

a1 = 2*sqrt(e1) 
a2 = 2*sqrt(e2) 

其中a1a2是长轴和短轴,和e1e2协方差矩阵的特征值。

我的问题是:给定边缘点(xi,yi)的图像椭圆,如何才能找到该椭圆的2×2协方差矩阵?

+0

矩阵不应该只是所有'xi'-s'yi'-s的协方差吗? – Shai

+0

我不确定!我为半径为100的圆生成边缘点。然后我定义了一个'p = [xi,yi]',其中P是一个边缘点矩阵'n x 2'。我使用了matlab命令'cov(P)'。我重新计算了协方差矩阵的圆的半径。但是,从原始半径给出不同的值。 (它给出141,140)! – Omar14

+1

......数字除以100应该响铃:) –

回答

2

只是纯逆向工程(我不熟悉了用这种材料),我可以这样做:

%// Generate circle 
R = 189; 
t = linspace(0, 2*pi, 1000).'; 
x = R*cos(t); 
y = R*sin(t); 

%// Find the radius? 
[~,L] = eig(cov([x,y])); 

%// ...hmm, seems off by a factor of sqrt(2) 
2*sqrt(diag(L))   

%// so it would come out right when I'd include a factor of 1/2 in the sqrt(): 
2*sqrt(diag(L)/2)   

那么,让我们来测试这一理论对于一般的椭圆:

%// Random radii 
a1 = 1000*rand; 
a2 = 1000*rand; 

%// Random rotation matrix 
R = @(a)[ 
    +cos(a) +sin(a); 
    -sin(a) +cos(a)]; 

%// Generate pionts on the ellipse 
t = linspace(0, 2*pi, 1000).'; 
xy = [a1*cos(t) a2*sin(t);] * R(rand); 

%// Find the deviation from the known radii 
%// (taking care of that the ordering may be different) 
[~,L] = eig(cov(xy)); 
min(abs(1-bsxfun(@rdivide, 2*sqrt(diag(L)/2), [a1 a2; a2 a1])),[],2) 

它总是返回一些可接受的小东西。

所以,似乎工作:)任何人都可以验证这确实是正确的?

+0

因子'sqrt(2)'是因为协方差矩阵是从沿椭圆周长的点计算的,而不是实心的椭圆。 OP的方程对于实椭圆的协方差矩阵是有效的。 –

0

要扩展Rody的答案,实心椭圆的协方差矩阵的特征值由lambda_i = r_i^2/4给出。这导致OP的方程r_i = 2*sqrt(lambda_i)

对于(非固体)椭圆形,如在OP的情况下,特征值是双那些固体箱子:lambda_i = r_i^2/2,导致r_i = sqrt(2*lambda_i)(其等于罗迪的2*sqrt(lambda_i/2))。

我无法直接找到这个参考,但协方差矩阵的数学与惯性矩的数学是相同的。 On Wikipedia您可以看到“圆形箍”和“实心圆盘”的情况,它们的相同因子为2.

下面是Rody测试的一种改编,既可以处理固体也可以处理非固体情况:

% Radius to test with 
r = rand(1,2); 

% Random rotation matrix 
R = @(a)[+cos(a) +sin(a); 
     -sin(a) +cos(a)]; 

% Generate pionts on the ellipse 
N = 1000; 
t = linspace(0, 2*pi, N).'; 
xy = r.*[cos(t),sin(t)] * R(rand); 
% Compute radii, compare to known radii 
L = eig(cov(xy)); 
r_ = sqrt(2*L)'; 
err = max(abs(1 - sort(r_) ./ sort(r))) 

% Generate points in the ellipse (SOLID CASE) 
N = 10000; 
t = 2*pi * rand(N,1); 
xy = r .* sqrt(rand(N,1)) .* [cos(t),sin(t)] * R(rand); 
% Compute radii, compare to known radii 
L = eig(cov(xy)); 
r_ = 2*sqrt(L)'; 
err_solid = max(abs(1 - sort(r_) ./ sort(r))) 

如果你运行这段代码,你会看到1E-3的错误,并〜6E-3(对我产生更多的点,该地区需要进行采样密集够多点的实情况;点越多,误差越小)。