2014-03-03 231 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(對我產生更多的點,該地區需要進行採樣密集夠多點的實情況;點越多,誤差越小)。