我一直在試圖解決一個問題。我很驚訝,我一直無法找到網上真正有用的東西。橢圓的協方差矩陣
我知道從橢圓的協方差矩陣的特徵值可以計算出橢圓的主軸和副軸。如下所示:
a1 = 2*sqrt(e1)
a2 = 2*sqrt(e2)
其中a1
和a2
是長軸和短軸,和e1
是e2
協方差矩陣的特徵值。
我的問題是:給定邊緣點(xi,yi)
的圖像橢圓,如何才能找到該橢圓的2×2協方差矩陣?
我一直在試圖解決一個問題。我很驚訝,我一直無法找到網上真正有用的東西。橢圓的協方差矩陣
我知道從橢圓的協方差矩陣的特徵值可以計算出橢圓的主軸和副軸。如下所示:
a1 = 2*sqrt(e1)
a2 = 2*sqrt(e2)
其中a1
和a2
是長軸和短軸,和e1
是e2
協方差矩陣的特徵值。
我的問題是:給定邊緣點(xi,yi)
的圖像橢圓,如何才能找到該橢圓的2×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)
它總是返回一些可接受的小東西。
所以,似乎工作:)任何人都可以驗證這確實是正確的?
因子'sqrt(2)'是因爲協方差矩陣是從沿橢圓周長的點計算的,而不是實心的橢圓。 OP的方程對於實橢圓的協方差矩陣是有效的。 –
要擴展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(對我產生更多的點,該地區需要進行採樣密集夠多點的實情況;點越多,誤差越小)。
矩陣不應該只是所有'xi'-s'yi'-s的協方差嗎? – Shai
我不確定!我爲半徑爲100的圓生成邊緣點。然後我定義了一個'p = [xi,yi]',其中P是一個邊緣點矩陣'n x 2'。我使用了matlab命令'cov(P)'。我重新計算了協方差矩陣的圓的半徑。但是,從原始半徑給出不同的值。 (它給出141,140)! – Omar14
......數字除以100應該響鈴:) –