精华内容
下载资源
问答
  • Python最小二乘法拟合直线,采用了2种不同的方式,一种是直接计算,另一种是调用numpy.linalg.solve()
  • C++最小二乘法拟合直线,根据数据直接计算直线的斜率、截距和相似度,即拟合的好坏。
  • java实现一元、多元、对数、指数等拟合(最小二乘法拟合直线、曲线)
  • 介绍了具体最小二乘法的数学推导,有兴趣学习和编码实现最小二乘法的可以看看
  • 使用最小二乘法拟合出的直线和曲线,基于c++实现,为了可视化,这里借助了opencv
  • 最小二乘法拟合直线和圆,QT界面实现,利用公式,读取文本文件进行拟合,并将结果用QT界面实时得显示出来
  • 最小二乘法拟合直线C语言,可用于采样点偏差拟合直线函数,减小误差
  • 3. 血液容积 v, t=0 注射剂量 d, 血药浓度立即为 d/v. 2. 药物排除速率与血药浓度成正比比例系数 k>0) 模型假设 1. 机体看作一个房室室内血药浓度均匀 一室模型 模型建立 ? d/ c(0) 3 ? 得 由假设 -kc dt dc 2 ?...
  • 最小二乘法拟合直线程序

    热门讨论 2010-12-19 09:18:33
    最小二乘法拟合直线。曲线拟合的最小二乘法(基于OpenCV实现)的,拟合图像中离散点的拟合直线 今天使用拟合的最小二乘法,求出了给定的一组坐标系上的点对最接近的直线的。
  • 最小二乘法拟合直线

    千次阅读 2019-07-04 16:24:00
    最小二乘法拟合直线 在科学实验和生产实践中,经常需要从一组实验数据出发寻求函数y=f(x)的一个近似表达式,也称为经验公式。从几何上看,就是希望根据给定的m个点,求曲线y=f(x)的一条近似曲线。因此这是个曲线...

    最小二乘法拟合直线

    在科学实验和生产实践中,经常需要从一组实验数据出发寻求函数y=f(x)的一个近似表达式,也称为经验公式。从几何上看,就是希望根据给定的m个点,求曲线y=f(x)的一条近似曲线。因此这是个曲线拟合问题。

    当我们要求近似曲线严格通过给定的每个点时,这是插值算法。对于本文所述的直线拟合来说,如果用插值算法,则只需要两个点就够了。实际直线拟合数据可能满足不了这个条件,为了便于计算,分析与应用,我们较多地根据“使测量点到直线距离的平方和最小”的原则来拟合。按最小二乘原则选择拟合曲线的方法,称为最小二乘法(Method of Least Squares)。

    利用最小二乘法拟合曲线的一般步骤是:

    • 将实验数据显示出来,分析曲线的形式;

    • 确定拟合曲线的形式。对于本文来说,曲线形式是直线,y=a+bx;

    • 建立法方程组并对其进行求解;

     

    因为OpenCASCADE中数据结构及算法丰富,所以用OpenCASCADE可以快速实现直线的最小二乘法拟合算法。下面给出具体实现代码:

    #include <iostream>
    
    #include <gp_Lin2d.hxx>
    #include <gp_Pnt2d.hxx>
    
    #include <TColgp_Array1OfPnt2d.hxx>
    
    #include <math_Vector.hxx>
    #include <math_SVD.hxx>
    #include <math_Gauss.hxx>
    #include <math_GaussLeastSquare.hxx>
    
    #include <OSD_Chronometer.hxx>
    
    
    void fitLine(const TColgp_Array1OfPnt2d& thePoints,
                 const std::string& theFileName,
                 gp_Lin2d& theLine)
    {
        math_Vector aB(1, 2, 0.0);
        math_Vector aX(1, 2, 0.0);
        math_Matrix aM(1, 2, 1, 2);
    
        Standard_Real aSxi = 0.0;
        Standard_Real aSyi = 0.0;
        Standard_Real aSxx = 0.0;
        Standard_Real aSxy = 0.0;
    
        std::ofstream aDrawFile(theFileName);
    
        for (Standard_Integer i = thePoints.Lower(); i <= thePoints.Upper(); ++i)
        {
            const gp_Pnt2d& aPoint = thePoints.Value(i);
    
            aSxi += aPoint.X();
            aSyi += aPoint.Y();
    
            aSxx += aPoint.X() * aPoint.X();
            aSxy += aPoint.X() * aPoint.Y();
    
            aDrawFile << "vpoint p" << i << " " <<
                         aPoint.X() << " " << aPoint.Y() << " 0" << std::endl;
        }
    
        aM(1, 1) = thePoints.Size();
        aM(1, 2) = aSxi;
        aM(2, 1) = aSxi;
        aM(2, 2) = aSxx;
    
        aB(1) = aSyi;
        aB(2) = aSxy;
    
        OSD_Chronometer aChronometer;
        aChronometer.Start();
    
        math_Gauss aSolver(aM);
        //math_GaussLeastSquare aSolver(aM);
        //math_SVD aSolver(aM);
        aSolver.Solve(aB, aX);
        if (aSolver.IsDone())
        {
            Standard_Real aA = aX(1);
            Standard_Real aB = aX(2);
    
            gp_Pnt2d aP1(0.0, aA);
            gp_Pnt2d aP2(-aA/aB, 0.0);
    
            theLine.SetLocation(aP1);
            theLine.SetDirection(gp_Vec2d(aP1, aP2).XY());
    
            aDrawFile << "vaxis l "
                      << aP1.X() << " " << aP1.Y() << " 0 "
                      << aP2.X() << " " << aP2.Y() << " 0 " << std::endl;
    
            std::cout << "===================" << std::endl;
            aX.Dump(std::cout);
        }
    
        aChronometer.Stop();
        aChronometer.Show();
    }
    
    int main()
    {
        gp_Lin2d aLine;
    
        // Test data 1
        TColgp_Array1OfPnt2d aPoints1(1, 6);
        aPoints1.SetValue(1, gp_Pnt2d(36.9, 181.0));
        aPoints1.SetValue(2, gp_Pnt2d(46.7, 197.0));
        aPoints1.SetValue(3, gp_Pnt2d(63.7, 235.0));
        aPoints1.SetValue(4, gp_Pnt2d(77.8, 270.0));
        aPoints1.SetValue(5, gp_Pnt2d(84.0, 283.0));
        aPoints1.SetValue(6, gp_Pnt2d(87.5, 292.0));
    
        fitLine(aPoints1, "fit1.tcl", aLine);
    
        // Test data 2
        TColgp_Array1OfPnt2d aPoints2(0, 7);
        aPoints2.SetValue(0, gp_Pnt2d(0.0, 27.0));
        aPoints2.SetValue(1, gp_Pnt2d(1.0, 26.8));
        aPoints2.SetValue(2, gp_Pnt2d(2.0, 26.5));
        aPoints2.SetValue(3, gp_Pnt2d(3.0, 26.3));
        aPoints2.SetValue(4, gp_Pnt2d(4.0, 26.1));
        aPoints2.SetValue(5, gp_Pnt2d(5.0, 25.7));
        aPoints2.SetValue(6, gp_Pnt2d(6.0, 25.3));
        aPoints2.SetValue(7, gp_Pnt2d(7.0, 24.8));
    
        fitLine(aPoints2, "fit2.tcl", aLine);
    
        return 0;
    }

    在函数fitLine()中,根据拟合点建立法方程组,并使用math_Gauss来对法方程组进行求解。其实也可以使用math_GaussLeastSquare或者math_SVD等求解法方程组。在主函数main()中测试了两组数据。测试数据1来自易大义等《计算方法》,测试数据2来自《高等数学》。程序运行结果如下图所示:

    与书中计算结果吻合。


    由于需要将计算结果显示出来,所以在fitLine()函数中增加了输出Draw脚本文件的代码,实际运用时可将这部分代码去掉。将程序生成的脚本文件加载到Draw中,即可得到下面两个图:

    测试数据1拟合直线


    测试数据2拟合直线


    综上所述,对于二维直线的最小二乘法拟合算法的关键是对建立的法方程组进行求解。OpenCASCADEmath包中提供了一些解方程组的类可以直接使用。对于没有使用OpenCASCADE的开发环境的情况,也可以使用其他矩阵库,如Eigen等用得很广泛。Eigen官方网站:http://eigen.tuxfamily.org/index.php?title=Main_Page


    将计算结果导出Draw脚本可视化,可以方便直观地查看拟合结果。如果熟悉其他脚本库如Pythonmatplotlib,也可以类似处理来将结果可视化。

    转载于:https://www.cnblogs.com/opencascade/p/fitLine.html

    展开全文
  • 线性回归线性回归是回归分析中最常见的一种建模方式。...最小二乘法最小二乘法用于求目标函数的最优值,它通过最小化误差的平方和寻找匹配项所以又称为:最小平方法;这里将用最小二乘法用于求得线性回归...

    线性回归

    线性回归是回归分析中最常见的一种建模方式。当因变量是连续的,自变量是连续的或者离散的,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。

    用方程 y = mx + c,其中 y为结果,x为特征,m为系数,c为误差 在数学中m为梯度c为截距。

    最小二乘法

    最小二乘法用于求目标函数的最优值,它通过最小化误差的平方和寻找匹配项所以又称为:最小平方法;这里将用最小二乘法用于求得线性回归的最优解

    关于最小二乘法推导过程,详见这篇博客 最小二乘法

    pandas 处理数据

    导入 pandas 模块

    import pandas as pd

    import matplotlib.pyplot as plt

    # jupyter 关于绘图的参数配置

    plt.style.use('ggplot')

    %config InlineBackend.figure_format = 'retina'

    %matplotlib inline

    获取表示长度和宽度关系的几组数据

    数据不是很完美,接下来利用 pandas 处理下

    修改列名

    重置索引

    df = df.rename(columns={'Unnamed: 0':'0'})

    df = df.set_index(keys=['0'])

    为了分析长度和宽度之间的线性关系,分别获取长度和宽度的一维数据

    xcord = df.loc['长度']

    ycord = df.loc['宽度']

    plt.scatter(xcord,ycord,s=30,c='red',marker='s')

    从宽度和长度的数据分布,可以看出具有一定的线性关系,接下来我们用最小二乘法来拟合这条直线

    最小二乘法的计算过程

    ## xy 的均值

    (xcord*ycord).mean()

    ## x 的均值乘以 y 的均值

    xcord.mean()* ycord.mean()

    ## x 的平方均值

    pow(xcord,2).mean()

    ## x 的均值的平方

    pow(xcord.mean(),2)

    # m 分子是 xy 的均值减去 x 的均值乘以 y 的均值;

    # m 分母是 x 平方的均值 减去 x 的均值的平方

    m = ((xcord*ycord).mean() - xcord.mean()* ycord.mean())/(pow(xcord,2).mean()-pow(xcord.mean(),2))

    # c 等于 y 的均值 - m 乘以 x 的均值

    c = ycord.mean() - m*xcord.mean()

    # 绘图

    plt.scatter(xcord,ycord,s=30,c='red',marker='s')

    x=np.arange(90.0,250.0,0.1)

    y=m*x+c

    plt.plot(x,y)

    plt.show()

    Python 建模

    处理数据,计算相关系数矩阵,提取特征和标签

    df = pd.read_csv('./zuixiaoerchengfa.csv',encoding='gbk')

    df.rename(columns={"Unnamed: 0":""},inplace=True)

    df.set_index(keys="",inplace=True)

    df_new = df.T

    df_new.corr()

    xcord = df_new['长度']

    ycord = df_new['宽度']

    引入 sklearn 模块得到训练集和测试集

    from sklearn.model_selection import train_test_split

    import matplotlib.pyplot as plt

    plt.style.use('ggplot')

    %config InlineBackend.figure_format = 'retina'

    %matplotlib inline

    # 训练数据、测试数据遵循二八法则

    x_train,x_test,y_train,y_test = train_test_split(xcord, ycord, train_size = 0.8, test_size = 0.2)

    # 从图可以看出两个特征之间适合简单线性回归模型

    plt.scatter(x_train,y_train,c = 'g')

    plt.xlabel("L")

    plt.ylabel("H")

    创建线性回归模型

    from sklearn.linear_model import LinearRegression

    model = LinearRegression()

    # model.fit model.score 需要传递二维列表,故通过 reshape 重塑

    x_train = x_train.values.reshape(-1,1)

    y_train = y_train.values.reshape(-1,1)

    model.fit(x_train,y_train)

    # 计算出拟合的最小二乘法方程

    # y = mx + c

    c = model.intercept_

    m = model.coef_

    c = round(float(c),2)

    m = round(float(m),2)

    print("最小二乘法方程 : y = {} + {}x".format(c,m))

    评估模型

    x_test = x_test.values.reshape(-1,1)

    y_test = y_test.values.reshape(-1,1)

    model.score(x_test,y_test)

    可视化效果

    通过可视化效果来感受模型拟合效果

    x_train_result = model.predict(x_train)

    plt.scatter(xcord,ycord,c = 'r', label = "source data")

    plt.scatter(x_train,y_train, c = 'b',label = "train data")

    plt.scatter(x_test,y_test,c = 'g',label = "test data")

    plt.xlabel("L")

    plt.ylabel("H")

    plt.legend(loc="upper left")

    plt.plot(x_train,x_train_result)

    展开全文
  • 最小二乘法拟合直线程序:function linear_fit %最小二乘法拟合直线clear;clc;prompt={'Name of data file'};title='Linear_fit';lineNo=2;def={'Linearfit.dat'};outval=inputdlg(prompt,title,lineNo,def);if ...

    最小二乘法拟合直线

    程序:

    function linear_fit %最小二乘法拟合直线clear;

    clc;

    prompt={'Name of data file'};

    title='Linear_fit';

    lineNo=2;

    def={'Linearfit.dat'};

    outval=inputdlg(prompt,title,lineNo,def);

    if isempty(outval)==1,return,end

    filename=outval{1};

    data=load(filename);

    x=data(:,1);

    y=data(:,2);

    [a,b]=linearfit(x,y);

    yy=a+b*x;

    func=['y=',num2str(a),'+',num2str(b),'*x']; plot(x,y,'bx','markersize',10);

    hold on

    plot(x,yy,'r-','linewidth',1.5)

    xlabel('T(^oC)');

    ylabel('R(\Omega)');

    text(x(2),yy(length(yy)-1),func)

    function [a,b]=linearfit(x,y)

    xy=x.*y;

    x2=x.^2;

    x_mean=mean(x);

    y_mean=mean(y);

    xy_mean=mean(xy);

    x2_mean=mean(x2);

    b=(xy_mean-x_mean*y_mean)/(x2_mean-x_mean^2); a=y_mean-b*x_mean;

    return

    展开全文
  • 最小二乘法的推导公式如下:y = bx + a c++代码实现如下: double k, b; //y=k*x+b void leastSquares(const vector<double> &X, const vector<double> &Y) { //最小二乘法生成线性回归方程 ...

    最小二乘法的推导公式如下:y = bx + a
    在这里插入图片描述
    c++代码实现如下:

    double k, b; //y=k*x+b
    void leastSquares(const vector<double> &X, const vector<double> &Y) { //最小二乘法生成线性回归方程
        size_t n = X.size();
        double x_average = 0.0, y_average = 0.0;
        double xy_sum = 0.0, x2_sum = 0.0;
        for (int i = 0; i < n; i++) {
            x_average += X[i];
            y_average += Y[i];
            xy_sum += X[i] * Y[i];
            x2_sum += X[i] * X[i];
        }
        x_average /= n;
        y_average /= n;
        k = (xy_sum - n * x_average * y_average) / (x2_sum - n * x_average * x_average);
        b = y_average - k * x_average;
    }
    double getY(double x) {
        return k * x + b;
    }
    

    使用过程中,只需将数组X和数组Y传入该函数,即可得到线性回归方程。

    2021.8.14更新
    上面的我实现了

    展开全文
  • 强烈推荐,利用excel用最小二乘法拟合直线的方法。
  • polyfit函数用于多项式拟合拟合y=a0+a1*x+a2*x^2+……+apoly_n*x^poly_n 参数: /// \param x 观察值的x /// \param y 观察值的y /// \param poly_n 期望拟合的阶数,若poly_n=2,则y=a0+a1*x+a2*x^2 /// \...
  • 最小二乘法拟合直线--智能车竞赛

    千次阅读 2020-02-03 13:26:28
    最小二乘法拟合直线 目录 最小二乘法拟合直线 1、简介 2、最小二乘法拟合直线原理 3、具体应用--智能车竞赛 4、代码实现 1、简介 最小二乘法是一种数学优化技术,它通过最小化误差的平方和来寻找已知数据...
  • 主要给大家介绍了关于python中matplotlib实现最小二乘法拟合的相关资料,文中通过示例代码详细介绍了关于最小二乘法拟合直线和最小二乘法拟合曲线的实现过程,需要的朋友可以参考借鉴,下面来一起看看吧。
  • 最小二乘法拟合直线簇交点及Ransac拟合最小二乘法的实现Ransac优化 语言环境:Python 直线簇方程:y=p→+v→∗ty=\overrightarrow p+\overrightarrow v*ty=p​+v∗t 其中p→\overrightarrow pp​表示直线上一点P的...
  • 代码中除了用OpenCV3.3库函数进行直线拟合,还自己根据拟合公式写了一个拟合接口函数,两个拟合出来的效果是一样的。
  • PAGE / NUMPAGES 有一组关于MH的实验数据附件1.data已知其符合 分布请利用最小二乘法编写程序求三个参数abc的值要求利用MATLAB编程20分 解拟合两组数据MH已知 只需确定多项式系数abc根据最小二乘原则使 所求问题成为...
  • C++:最小二乘法拟合直线

    千次阅读 2021-10-29 10:26:20
    #include <...* @brief 得到最小二乘法拟合直线的系数矩阵X A*X = B * param[in] points 单个虚线轮廓内的所有中点 * param[out] 最小二乘法拟合出的直线的系数 直线 y= ax + b,返回结果即为(a,b) *.
  • 最小二乘法拟合直线 程序 function linear_fit % 最小二乘法拟合直线 clear; clc; prompt={'Name of data file'}; title='Linear_fit; lineNo=2; def={'Linearfit.dat'}; outval=inputdlg(prompt,title,lineNo,def; ...
  • import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import ConnectionPatch from scipy.interpolate import spline plt.rcParams['font.sans-serif'] = ['SimHei'] ...
  • 写的很加粗样式好的一篇文章,特此转载: https://www.cnblogs.com/arli/p/11428205.html
  • 本节Jungle用C++实现最小二乘法拟合平面直线。 1.理论知识 平面直线的通用方程可以表示为 其中,A是直线的截距,B是直线的斜率。对于测量的二维坐标(x,y),x是精确分布的,而y是观测值。基于最小二乘的理论,...
  • opencv学习——最小二乘法拟合直线

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

    万次阅读 2017-12-18 20:41:33
    最近公司的一个项目需要计算TVDI(Temperature Vegetation Dryness Index ,温度植被干旱指数) ,TVDI的计算公式如下(具体原理自行百度):其中,为任意像元的地表...在拟合干边和湿边的过程中,需要利用最小二乘...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,198
精华内容 3,679
关键字:

最小二乘法拟合直线