我一直在试图解决一个问题。我很惊讶,我一直无法找到网上真正有用的东西。椭圆的协方差矩阵
我知道从椭圆的协方差矩阵的特征值可以计算出椭圆的主轴和副轴。如下所示:
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应该响铃:) –