多点拟合
- leastsq的doc
- scipy的GitHub看拟合问题
1 | def leastsq(func, x0, args=(), Dfun=None, full_output=0, |
以上为大家常用python数据分析库拟合曲线方程的方法。但是这里可以看到计算得到的方程并不是最优解而是牛顿迭代不断逼近的解。(SO:调库要谨慎!)
直线拟合
- 首先scipy.optimize.leastsq可以直接调用就行。然后我看网上很多雷同的博客用的这个库直接调用的,自己测试后对于此库个人保留怀疑态度。所以下面是自己写的一个对于直线方程的拟合函数
1 | # 这里用的方程是y=k*x+b |
推导过程
- 直线方程为$y = kx + b$
- 先求k为$k = \frac{\sum^n_{i=1}(x_i-\bar{x})(y_i-\bar{y})}{\sum^n_{i=1}(x_i-\bar{x})^2}$
- 再求b为$b = \bar{y} - k\bar{x}$
针对椭圆的最小二乘法拟合
- 平面上任意位置的一个椭圆,其中心坐标为(x0,y0),半长轴a,半短轴b,长轴偏角为θ,方程为$x^2 + Axy + By^2 + Cx + Dy + E = 0$
- 转换为标准椭圆方程$\frac{(x-x_0)^2}{a^2} + \frac{(y-y_0)^2}{b^2} = 1$时,参数计算为:
- $x_0 = \frac{2BC-AD}{A^2-4B}$
- $y_0 = \frac{2D-AD}{A^2-4B}$
- $a = \sqrt{\frac{2(ACD-BC^2-D^2+4BE-A^2E)}{(A^2-4B)(B+\sqrt{A^2+(1-B)^2}+1)}}$
- $b = \sqrt{\frac{2(ACD-BC^2-D^2+4BE-A^2E)}{(A^2-4B)(B-\sqrt{A^2+(1-B)^2}+1)}}$
- $\theta = \arctan(\sqrt{\frac{a^2-b^2B}{a^2B-b^2}})$
- 在原始测得的N(N≥5)组数据(xi,yi),(i=1,2,3,…,N)中,根据椭圆方程通式和最小二乘法原理,求目标函数$F(A, B, C, D, E) = \sum^N_{i=1}(x_i^2 + Ax_iy_i + By_i^2 + Cx_i + Dy_i + E)^2$的最小值来确定参数A、B、C、D和E的值
- 令F(A,B,C,D,E)对各个参数的偏导数均为零,得到以下方程组:
$$
\begin{bmatrix}
\sum^N_{i=1}x_i^2y_i^2 & \sum^N_{i=1}x_i^2y_i^3 & \sum^N_{i=1}x_i^2y_i & \sum^N_{i=1}x_iy_i^2 & \sum^N_{i=1}x_iy_i \
\sum^N_{i=1}x_iy_i^3 & \sum^N_{i=1}y_i^4 & \sum^N_{i=1}x_iy_i^2 & \sum^N_{i=1}y_i^3 & \sum^N_{i=1}y_i^2 \
\sum^N_{i=1}x_i^2y_i & \sum^N_{i=1}x_iy_i^2 & \sum^N_{i=1}x_i^2 & \sum^N_{i=1}x_iy_i & \sum^N_{i=1}x_i \
\sum^N_{i=1}x_iy_i^2 & \sum^N_{i=1}y_i^2 & \sum^N_{i=1}x_iy_i & \sum^N_{i=1}y_i^2 & \sum^N_{i=1}y_i \
\sum^N_{i=1}x_iy_i & \sum^N_{i=1}y_i^2 & \sum^N_{i=1}x_i & \sum^N_{i=1}y_i & N \
\end{bmatrix}
\begin{bmatrix}
A \
B \
C \
D \
E \
\end{bmatrix} =
\begin{bmatrix}
\sum^N_{i=1}x_i^3y_i \
\sum^N_{i=1}x_i^2y_i^2 \
\sum^N_{i=1}x_i^3 \
\sum^N_{i=1}x_i^2y_i \
\sum^N_{i=1}x_i^2 \
\end{bmatrix}
$$
- 求解此线性方程组可解出A、B、C、D和E,代入第二个方程即可解得拟合的椭圆的参数
- 代码如下:
1 | # -*- coding: utf-8 -*- |