精华内容
下载资源
问答
  • 最小二乘法拟合直线

    2021-04-13 08:46:25
    最小二乘法拟合直线 #define N 4 /* * 最小二乘法拟合直线 y = k0 + k1 * x * x[] 拟合数据的x向量 * y[] 拟合数据的y向量 * k[] 拟合后的系数向量 k0 = k[0], k1 = k[1] * */ void fitLineMethod(double x[N...

    最小二乘法拟合直线

    
    #define N 4
    
    /*
     * 最小二乘法拟合直线 y = k0 + k1 * x
     * x[] 拟合数据的x向量
     * y[] 拟合数据的y向量
     * k[] 拟合后的系数向量 k0 = k[0], k1 = k[1]
     * */
    void fitLineMethod(double x[N], double y[N], double k[2]) {
        double k1 = 0, k2 = 0, k3 = 0, k4 = 0, k5 = 0;
        k[0] = 0;
        k[1] = 0;
        for (int i = 0; i < N; i++) {
            k1 += x[i] * x[i];
            k2 += x[i];
            k3 += x[i] * y[i];
            k4 += 1;
            k5 += y[i];
        }
        if (k2 * k2 != k1 * k4) {
            k[0] = (k2 * k3 - k1 * k5) / (k2 * k2 - k1 * k4);
            k[1] = (k2 * k5 - k3 * k4) / (k2 * k2 - k1 * k4);
        }
    }
    
    展开全文
  • 最小二乘法拟合直线C语言,可用于采样点偏差拟合直线函数,减小误差
  • C++最小二乘法拟合直线,根据数据直接计算直线的斜率、截距和相似度,即拟合的好坏。
  • Python最小二乘法拟合直线,采用了2种不同的方式,一种是直接计算,另一种是调用numpy.linalg.solve()
  • 最小二乘法拟合直线 程序 function linear_fit % 最小二乘法拟合直线 clear; clc; prompt={'Name of data file'}; title='Linear_fit; lineNo=2; def={'Linearfit.dat'}; outval=inputdlg(prompt,title,lineNo,def; ...
  • 最小二乘法拟合直线和圆,QT界面实现,利用公式,读取文本文件进行拟合,并将结果用QT界面实时得显示出来
  • 利用点到直线距离 最小二乘法拟合直线 非矩阵算法

    利用点到直线距离 最小二乘法拟合直线 非矩阵算法

    -学习了几天最小二乘法拟合直线,总结一下主要有两种方式:

    1. 直线方程Y=kX+b, 利用Y轴方向距离 最小来拟合直线Σ(Yi-kXi-b)²--------[c++]两分钟弄懂"最小二乘法拟合直线
    2. 直线方程AX+BY+C=0,利用点到直线的距离最小来拟合直线Σ(AXi+BYi+C)²/(A²+B²)------最小二乘拟合直线真的没问题么

    今天主要记录一下第二中方式利用点到直线的距离最小来拟合直线
    ,由于Σ(AXi+BYi+C)²/(A²+B²)这中式子求偏导后太复杂,网上大神们主要都是用矩阵运算来求解,知乎大神Dr.Sheng的文章,我用了他的方法,核心是SVD算法opencv里也有,达到了预期的效果,但是矩阵运算比较耗时间,我测了一下大概 (拟合800个点,执行100次需60ms)。我在想能否用普通计算的方式实现。知乎大神的的文章给了我灵感。结果和SVD算法完全一致。
    下面说一下计算过程

    1. 拟合的直线必然过所有点的中心(Xavr,Yavr),即(X平均,Y平均)
    2. 将所有点的的坐标减去中心坐标(Xavr,Yavr),将直线移动到原点位置,直线过原点直线公式简化为y=kx,即kx-y=0
    3. 点到直线的距离公式:绝对值|AXi+BYi+C|/√(A²+B²);带入A=k,B=-1,C=0;简化为|AXi-Yi|/√(A²+1)
    4. 利用公式|AXi-Yi|/√(AA+1),最小二乘法求出A; ∑(AXi-Yi)²/(A²+1)最小,其对A的导数为0,导数化简后 ∑ XiYi*A²+(Xi²-Yi²)A-XiYi =0
    5. 令K=∑ XiYi; L=∑(Xi²-Yi²); M=∑ -XiYi(程序中用的A=∑ XiYi;B=∑(Xi²-Yi²);C=∑ -XiYi)
    6. 利用二次方程求根公式x=[-b±√(b²-4ac)]/2a,可以求出A=[-L±√(L²-4KM)]/2K,取加号A=[-L+√(L²-4KM)]/2K
    7. k=A
    8. n=Yavr - Xavr * k
    9. 直线公式即为y=kx+n

    下面给出代码

     public static bool LineFitPCA(List<Point2d> Points, out double k, out double n)
     {
                k = 0.0;
                n = 0.0;
                double Xavr = 0.0;
                double Yavr = 0.0;
                int N = Points.Count;
                if (N < 2) return false;
    
    foreach (var pt in Points)
                {
                    Xavr += pt.X;
                    Yavr += pt.Y;
                }
                Xavr = Xavr / N;
                Yavr = Yavr / N;
                double A = 0, B = 0, C = 0;
                for (int i = 0; i < N; i++)
                {
                    double x = Points[i].X - Xavr;
                    double y = Points[i].Y - Yavr;
                    A += x * y;
                    B += x * x - y * y;
                    C += -x * y;
                }
                double k1 = (-B + Math.Sqrt(B * B - 4 * A * C)) / (2 * A);
                double k2 = (-B - Math.Sqrt(B * B - 4 * A * C)) / (2 * A);
               
                k = k1;
                n = Yavr - Xavr * k ;
                return true;
    
     }
    展开全文
  • 最小二乘法拟合直线程序

    热门讨论 2010-12-19 09:18:33
    最小二乘法拟合直线。曲线拟合的最小二乘法(基于OpenCV实现)的,拟合图像中离散点的拟合直线 今天使用拟合的最小二乘法,求出了给定的一组坐标系上的点对最接近的直线的。
  • 使用最小二乘法拟合出的直线和曲线,基于c++实现,为了可视化,这里借助了opencv
  • opencv学习——最小二乘法拟合直线

    万次阅读 多人点赞 2018-07-03 10:36:46
    最小二乘法拟合直线概念:最小二乘法多项式直线拟合,根据给定的点,求出它的函数y=f(x),当然求得准确的函数是不太可能的,但是我们能求出它的近似曲线y=φ(x) 原理假设有点 , I = 1,2,3,……n,求近似曲线y=φ(x)...

     最小二乘法拟合直线

    概念:最小二乘法多项式直线拟合,根据给定的点,求出它的函数y=f(x),当然求得准确的函数是不太可能的,但是我们能求出它的近似曲线y=φ(x)

     

    原理
    假设有点  , I = 1,2,3,……n,求近似曲线y=φ(x),并且使得y=φ(x)与y=f(x)的平方偏差和最小,偏差

      

     

     

    其中我们要找到一组最好的a b ,“最好的”就是要使选出的a b能使得所有的误差达到最小化。

    在此要注意以下,y=ax+b 这里面的未知量是什么,很自然的说法是x y,实际上并不是,我们不用去解这个x和y ,因为x和y已经是给定的值了,当我们在找这条直线的时候,我们实际上并不关心x的值有多好,我们要的就是a 和b这两个变量,它们可以描述x和y之间的关系,我们就是在试图找出那条最适合的直线所对应的a和b。

     


    可以看到最小二乘法对各个变量求偏导,使得偏导值为0,即可得到最小值,因为e是关于a b的函数,导数为0的点必定是最小值,进入正题

     分别对 a b求偏导可以得到:


    关于solve函数 ,可以在这个链接查看用法:solve函数使用

    接下来上代码

    #include<iostream>
    #include<opencv2\opencv.hpp>
    using namespace std;
    using namespace cv;
    
    
    int main()
    {
    	vector<Point>points;
    	//(27 39) (8 5) (8 9) (16 22) (44 71) (35 44) (43 57) (19 24) (27 39) (37 52)
    
    	points.push_back(Point(27, 39));
    	points.push_back(Point(8, 5));
    	points.push_back(Point(8, 9));
    	points.push_back(Point(16, 22));
    	points.push_back(Point(44, 71));
    	points.push_back(Point(35, 44));
    	points.push_back(Point(43, 57));
    	points.push_back(Point(19, 24));
    	points.push_back(Point(27, 39));
    	points.push_back(Point(37, 52));
    	Mat src = Mat::zeros(400, 400, CV_8UC3);
    
    	for (int i = 0;i < points.size();i++)
    	{
    		//在原图上画出点
    		circle(src, points[i], 3, Scalar(0, 0, 255), 1, 8);
    	}
    	//构建A矩阵 
    	int N = 2;
    	Mat A = Mat::zeros(N, N, CV_64FC1);
    
    	for (int row = 0;row < A.rows;row++)
    	{
    		for (int col = 0; col < A.cols;col++)
    		{
    			for (int k = 0;k < points.size();k++)
    			{
    				A.at<double>(row, col) = A.at<double>(row, col) + pow(points[k].x, row + col);
    			}
    		}
    	}
    	//构建B矩阵
    	Mat B = Mat::zeros(N, 1, CV_64FC1);
    	for (int row = 0;row < B.rows;row++)
    	{
    
    		for (int k = 0;k < points.size();k++)
    		{
    			B.at<double>(row, 0) = B.at<double>(row, 0) + pow(points[k].x, row)*points[k].y;
    		}
    	}
    	//A*X=B
    	Mat X;
    	//cout << A << endl << B << endl;
    	solve(A, B, X,DECOMP_LU);
    	cout << X << endl;
    	vector<Point>lines;
    	for (int x = 0;x < src.size().width;x++)
    	{				// y = b + ax;
    		double y = X.at<double>(0, 0) + X.at<double>(1, 0)*x;
    		printf("(%d,%lf)\n", x, y);
    		lines.push_back(Point(x, y));
    	}
    	polylines(src, lines, false, Scalar(255, 0, 0), 1, 8);
    	imshow("src", src);
    	
    	//imshow("src", A);
    	waitKey(0);
    	return 0;
    }

    可以看到如下结果


    展开全文
  • 最小二乘法拟合直线 目录 最小二乘法拟合直线 1、简介 2、最小二乘法拟合直线原理 3、具体应用--智能车竞赛 4、代码实现 1、简介 最小二乘法是一种数学优化技术,它通过最小化误差的平方和来寻找已知数据...

                                             最小二乘法拟合直线


    目录

             最小二乘法拟合直线

    1、简介

    2、最小二乘法拟合直线原理

     3、具体应用--智能车竞赛

    4、代码实现


    1、简介

       最小二乘法是一种数学优化技术,它通过最小化误差的平方和来寻找已知数据的最佳函数匹配。

    2、最小二乘法拟合直线原理

    已知数据:(x_1{}, y_1{}), (x_2{}, y_2{}), (x_3{}, y_3{})... (x_n{}, y_n{})需要拟合的直线表达式:y = ax + b

    其中误差:d_i{} = y_i{} - (ax_i{} + b)

    误差平方和:D = \sum_{i = 1}^{n}(y_i{} - (ax_i{}+b))^{2} = \sum_{i = 1}^{n}(y_i{} - ax_i{}-b)^{2}

    接下来利用微分的知识最小化误差平方和。

    一阶偏微分

    \frac{\partial D}{\partial a} = \sum _{i = 1}^{n}2(y_i - ax_i - b) (-x_i) = 2\sum _{i = 1}^{n}(ax_i^2 + bx_i - x_iy_i)

    \frac{\partial D}{\partial b} = \sum _{i = 1}^{n}2(y_i - ax_i - b) (-1) = 2\sum _{i = 1}^{n}(ax_i + b - y_i)

    二阶偏微分

    \frac{\partial ^2D}{\partial a^2} = 2\sum_{i = 1}^{n}x_i^2 \geq 0

    \frac{\partial ^2D}{\partial b^2} = 2n \geq 0

    可以看出二阶微分大于等于0,满足最小值条件,接下来令一阶偏微分等于0即可求出a,b。

    \frac{\partial D}{\partial a} = \sum _{i = 1}^{n}2(y_i - ax_i - b) (-x_i) = 2\sum _{i = 1}^{n}(ax_i^2 + bx_i - x_iy_i) = 0   

     \frac{\partial D}{\partial b} = \sum _{i = 1}^{n}2(y_i - ax_i - b) (-1) = 2\sum _{i = 1}^{n}(ax_i + b - y_i) = 0

    引入平均数

    a\overline{x^2} + b\overline{x} - \overline{xy} = 0

    a\overline{x} + b - \overline{y} = 0

    最终解得

    a = \frac{\overline{xy} - \overline{x} \cdot \overline{y}}{\overline{x^2} - \overline{x}^2}

    b = \overline{y} - a\overline{x}

    最后就可以直接利用上面的式子进行拟合直线了。

     3、具体应用--智能车竞赛

       再利用相关的图像处理方法求出图像的中线后,通常情况下中线不是很光滑,可以利用最小二乘法进行拟合光滑。

    4、代码实现

     利用直线y = 4x + 3进行测试。

    #include <iostream>
    using namespace std;
    
    struct Point
    {
    	int ori_row;
    	int ori_col;
    };
    
    void FitStraightLine(struct Point *src, int start, int end)
    {
      int n = end - start;
      int x_add = 0;
      int y_add = 0;
      int xy_add = 0;
      int xx_add = 0;
      float x_bar = 0.0;
      float y_bar = 0.0;
      float xy_bar = 0.0;
      float xx_bar = 0.0;
      float k = 0.0;
      float b = 0.0;
      float b_add = 0.0;
      
      for(int i = start; i < end; i++)
      {
        x_add  +=  src[i].ori_col;
        y_add  +=  src[i].ori_row;
        xx_add += (src[i].ori_col * src[i].ori_col);
        xy_add += (src[i].ori_row * src[i].ori_col);
      }
      
      x_bar  = x_add   * 1.0 / n;
      y_bar  = y_add   * 1.0 / n;
      xx_bar = xx_add  * 1.0 / n;
      xy_bar = xy_add  * 1.0 / n;
      
      k = (xy_bar - x_bar * y_bar) / (xx_bar - x_bar * x_bar); //拟合直线斜率
      b = y_bar - k * x_bar;//拟合直线的常数项
    
      cout << "k = " << k << endl;
      cout << "b = " << b << endl;
    }
    
    int main()
    {
    	struct Point p[100];
    	
    	for(int i = 1; i < 100; i++)//利用 y = 4x + 3赋初值 
    	{
    		p[i].ori_row = i;
    		p[i].ori_col = (i - 3) / 4;
    	} 
    	
    	FitStraightLine(p, 1, 100);
    	
    	return 0;
    }

    运行结果

    可以看出k值计算的比较准确,b计算的不是很准确。

    展开全文
  • java实现一元、多元、对数、指数等拟合(最小二乘法拟合直线、曲线)
  • 最小二乘法拟合直线簇交点及Ransac拟合最小二乘法的实现Ransac优化 语言环境:Python 直线簇方程:y=p→+v→∗ty=\overrightarrow p+\overrightarrow v*ty=p​+v∗t 其中p→\overrightarrow pp​表示直线上一点P的...
  • 强烈推荐,利用excel用最小二乘法拟合直线的方法。
  • 最小二乘法拟合直线 概念:最小二乘法多项式直线拟合,根据给定的点,求出它的函数y=f(x),当然求得准确的函数是不太可能的,但是我们能求出它的近似曲线y=φ(x) 原理 假设有点 , I = 1,2,3,……n,求近似曲线y=φ...
  • OpenCV 与 Matlab 中最小二乘法拟合直线数据不一致的问题 在使用最小二乘法拟合直线时,在 OpenCV 中拟合出的结果与 Matlab 中不一致。查阅资料后,发现 Matlab 中,使用最小二乘拟合时,使用的残差函数为y 的差值,...
  • PAGE / NUMPAGES 有一组关于MH的实验数据附件1.data已知其符合 分布请利用最小二乘法编写程序求三个参数abc的值要求利用MATLAB编程20分 解拟合两组数据MH已知 只需确定多项式系数abc根据最小二乘原则使 所求问题成为...
  • 直线拟合直线拟合已知图中拟合数据的坐标,对图中的拟合数据进行直线拟合。依旧使用最小二乘法求解Ax=b——————1无解下的最优解。已知点的个数为n,所求直线的方程为y1=ax1+b,A由方程右边的a,b的系数构成构成...
  • 使用opencv中的Mat实现用矩阵的方式根据最小二乘法拟合直线和平面方程,但是好像不能实现拟合斜率无穷大的直线和平面方程,后续再改进吧。 有关于原理部分,有时间再详细写一下。 #include "stdafx.h" #...
  • 最小二乘法拟合直线概念:最小二乘法多项式直线拟合,根据给定的点,求出它的函数y=f(x),当然求得准确的函数是不太可能的,但是我们能求出它的近似曲线y=φ(x)原理假设有点 , I = 1,2,3,……n,求近似曲线y=φ(x),...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 686
精华内容 274
关键字:

最小二乘法拟合直线