Least squares fitting two-dimensional straight line

insert image description here

Crawler websites are self-respecting.

1. Principle overview

  The expression of a plane line is:
y = kx + b (1) y=kx+b \tag{1}y=kx+b( 1 )
  Suppose there arennn个点 ( x i , y i ) ( 0 ≤ i < n ) (x_i, y_i)(0≤i<n) (xi,yi)0i<n ) , so the objective function is:
f ( x ) = ∑ i = 1 nkxi + b − yi (2) f(x)=\sum_{i=1}^n kx_i+b-y_i\tag{2}f(x)=i=1nkxi+byi( 2 ) Calculate f ( x ) f(x)
  respectivelyf ( x ) fork , bk , bkb的偏导数:
δ f δ k = ∑ i = 1 n 2 ( k x i + b − y i ) x i = 2 ∑ i = 1 n k x i 2 + b x i − x i y i = 2 ( k ∑ i = 1 n x i 2 + b ∑ i = 1 n x i − ∑ i = 1 n x i y i ) (3) \frac{\delta f}{\delta k}=\sum_{i=1}^n 2(kx_i+b-y_i)x_i=2\sum_{i=1}^n kx_i^2+bx_i-x_iy_i \\=2(k \sum_{i=1}^n x_i^2+b\sum_{i=1}^n x_i- \sum_{i=1}^n x_iy_i)\tag{3} δkf _=i=1n2(kxi+byi)xi=2i=1nkxi2+bxixiyi=2(ki=1nxi2+bi=1nxii=1nxiyi)(3)

δ f δ b = ∑ i = 1 n 2 ( k x i + b − y i ) = 2 ∑ i = 1 n k x i + b − y i = 2 ( k ∑ i = 1 n x i + b n − ∑ i = 1 n y i ) (4) \frac{\delta f}{\delta b}=\sum_{i=1}^n 2(kx_i+b-y_i)=2\sum_{i=1}^n kx_i+b-y_i \\=2(k \sum_{i=1}^n x_i+bn- \sum_{i=1}^n y_i)\tag{4} b _f _=i=1n2(kxi+byi)=2i=1nkxi+byi=2(ki=1nxi+bni=1nyi)(4)

  Let the partial derivatives of formula (3) and formula (4) be 0, and get a system of binary linear equations:

{ k ∑ i = 1 n x i 2 + b ∑ i = 1 n x i = ∑ i = 1 n x i y i k ∑ i = 1 n x i + b n = ∑ i = 1 n y i (5) \begin{cases} k \sum_{i=1}^n x_i^2+b\sum_{i=1}^n x_i= \sum_{i=1}^n x_iy_i\\ k \sum_{i=1}^n x_i+bn= \sum_{i=1}^n y_i \end{cases} \tag{5} { ki=1nxi2+bi=1nxi=i=1nxiyiki=1nxi+bn=i=1nyi(5)

A = ∑ i = 1 n x i 2 , B = ∑ i = 1 n x i , C = ∑ i = 1 n x i y i , D = ∑ i = 1 n y i A=\sum_{i=1}^n x_i^2,B=\sum_{i=1}^n x_i,C=\sum_{i=1}^n x_iy_i,D=\sum_{i=1}^n y_i A=i=1nxi2,B=i=1nxi,C=i=1nxiyi,D=i=1nyi
So there are:

{ A k + B b = C B k + b n = D (6) \begin{cases} Ak+Bb=C\\ Bk+bn=D \end{cases} \tag{6} { A q+Bb=CBk+bn=D( 6 )
Solve the above equations to getk, bk, bkb
{ k = n C − B D n A − B 2 b = D A − B C n A − B 2 (7) \begin{cases} k=\frac{nC-BD}{nA-B^2}\\ b=\frac{DA-BC}{nA-B^2} \end{cases} \tag{7} { k=n A B2nCBDb=n A B2D A BC(7)

2. Python implementation

# -----------------------------------拟合直线y=kx+b--------------------------------
n = points.shape[0]
A = sum(x * x)
B = sum(x)
C = sum(x * y)
D = sum(y)
k = (n * C - B * D) / (n * A - B * B)
b = (D * A - B * C) / (n * A - B * B)

insert image description here

3. matlab implementation

n = pc.Count;
A = sum(x.^2);
B = sum(x);
C = sum(x.*y);
D = sum(y);
k = (n * C - B * D) / (n * A - B * B);
b = (D * A - B * C) / (n * A - B * B);

insert image description here

4. C++ implementation

    int n = cloud->points.size();
	double A = 0.0, B = 0.0, C = 0.0, D = 0.0;

	for (int i = 0; i < n; i++)
	{
    
    
		A += pow(cloud->points[i].x, 2);
		B += cloud->points[i].x;
		C += cloud->points[i].x * cloud->points[i].y;
		D += cloud->points[i].y;
		
	}

	double k = (n * C - B * D) / (n * A - B * B);
	double b = (D * A - B * C) / (n * A - B * B);

insert image description here

Guess you like

Origin blog.csdn.net/qq_36686437/article/details/132003229