最小二乘拟合椭圆

已知椭圆方程

a x 2 + b x y + c y 2 + d x + e y = 1 ax^{2}+bxy+cy^{2}+dx+ey=1 ax2+bxy+cy2+dx+ey=1

令 a = a , b , c , d , e T , x = x 2 , x y , y 2 , x , y T a=a,b,c,d,e^{T},x=x\^{2},xy,y\^{2},x,y^{T} a=a,b,c,d,eT,x=x2,xy,y2,x,yT,于是方程可表示为 a T x = 1 a^{T}x=1 aTx=1。那么拟合椭圆的最优化问题可表示为:

min ⁡ ∥ D a ∥ 2 \min\|D a\|^{2} min∥Da∥2

s.t. a T C a = 1 a^{T}Ca=1 aTCa=1

其中D表示数据样本集合 n × 6 n\times6 n×6,6表示维度, n n n表示样本数。 a a a表示椭圆方程的参数,矩阵常数矩阵 C C C为:

C = 0 0 2 0 0 0 0 − 1 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 C=\begin{bmatrix}0 & 0 & 2 & 0 & 0 & 0\\ 0 & -1 & 0 & 0 & 0 & 0\\ 2 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0\end{bmatrix} C= 0020000−10000200000000000000000000000

根据拉格朗日乘子法,引入拉格朗日因子 λ \lambda λ,得到以下的两个等式方程:

2 D T D a − 2 λ C a = 0 2D^{T}Da-2\lambda Ca=0 2DTDa−2λCa=0

a T C a = 1 a^{T}Ca=1 aTCa=1

令 S = D T D S=D^{T}D S=DTD,那么上述方程可改写为:

S a = λ C a Sa=\lambda Ca Sa=λCa

a T C a = 1 a^{T}Ca=1 aTCa=1

求解方程 S a = λ C a Sa=\lambda Ca Sa=λCa的特征值和向量 ( λ i , u i ) (\lambda_{i},u_{i}) (λi,ui),那么同样地 ( λ i , μ u i ) (\lambda_{i},\mu u_{i}) (λi,μui)也是方程 S a = λ C a Sa=\lambda Ca Sa=λCa的特征解,其中 μ \mu μ是任意的实数。而根据方程 a T C a = 1 a^{T}Ca=1 aTCa=1,可以容易地找到一个 μ \mu μ,使得 μ 2 u i T C u i = 1 \mu^{2}u_{i}^{T}Cu_{i}=1 μ2uiTCui=1,即:

μ i = 1 u i T C u i 2 = λ i u i T S u i 2 \mu_{i}=\sqrt2{\frac{1}{u_{i}^{T}Cu_{i}}}=\sqrt2{\frac{\lambda_{i}}{u_{i}^{T}Su_{i}}} μi=2uiTCui1 =2uiTSuiλi

最后令 a ˉ i = μ i u i \bar{a}{i}=\mu{i}u_{i} aˉi=μiui,取 λ i > 0 \lambda_{i}>0 λi>0对应的特征向量 u i u_{i} ui,即可作为曲线拟合的方程解。

Matlab实现的为代码只需要六行,如下所示:

matlab 复制代码
% x,y are lists of coordinates
function a = fit_ellipse(x,y)
    % Build design matrix
    D = [x.*x x.*y y.*y x y ones(size(x))];
    % Build scatter matrix
    S = D'*D;
    % Build 6x6 constraint matrix
    C(6,6) = 0; C(1,3) = 2; C(2,2) = -1; C(3,1) = 2;
    % Solve eigensystem
    [gevec, geval] = eig(inv(S)*C);
    % Find the positive eigenvalue
    [PosR, PosC] = find(geval > 0 & ~isinf(geval));
    % Extract eigenvector corresponding to positive eigenvalue
    a = gevec(:, PosC);
相关推荐
明志数科2 小时前
自主探索范式下机器人示教数据的工程定位:少量示范为何对质量更敏感
人工智能·机器学习·机器人
薛定e的猫咪4 小时前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
薛定e的猫咪4 小时前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习
云舜言传6 小时前
Bloom 手势演示操作 · 录屏指南
javascript·深度学习·机器学习
云淡风轻~窗明几净7 小时前
角谷猜想最接近严格证明的测试 Version1.1.1
人工智能·算法·机器学习·图论
机器学习之心7 小时前
PINN × SVM × NSGA-II × 熵权TOPSIS:一套跑通「建模—优化—决策」的多目标优化框架
算法·机器学习·支持向量机
别动我齐刘海8 小时前
机器人 C++ / 系统联调补强2——异常处理、Protobuf
linux·c++·人工智能·学习·算法·机器学习·机器人
葫三生9 小时前
关于三生原理系列被技术开发社区批量收录或引发策展边界讨论的一种思考
大数据·人工智能·深度学习·算法·机器学习·数据挖掘·开源
持续学习的程序员+19 小时前
跟随一次“沙拉酱瓶入篮”任务,理解 RPent(harness vla) 的完整工作流程
人工智能·深度学习·机器学习
云淡风轻~窗明几净9 小时前
角谷猜想与百度AI的对话dialog(原始稿)
人工智能·算法·机器学习·图论