直线拟合

很早就想学习拟合了,经常听同事用到拟合,当时尚且一窍不通,必须快递加急紧追此处才是,也参考了网上大佬的一些宝贵经验,先将拟合方法总结如下:

最小二乘法

1.原理

2.举例实现

void fitline3(){float b = 0.0f, k=0.0f;vector<Point>points;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, 255, 0), 1, 8);}int n = points.size();double xx_sum = 0;double x_sum = 0;double y_sum = 0;double xy_sum = 0;for (int i = 0; i < n; i++){x_sum += points[i].x; //x的累加和y_sum += points[i].y; //y的累加和xx_sum += points[i].x * points[i].x; //x的平方累加和xy_sum += points[i].x * points[i].y; //x,y的累加和}k = (n*xy_sum - x_sum * y_sum) / (n*xx_sum - x_sum * x_sum); //根据公式求解kb = (-x_sum * xy_sum + xx_sum*y_sum) / (n*xx_sum - x_sum * x_sum);//根据公式求解bprintf("k = %f, b = %f\n", k, b); //k = 1.555569, b = -4.867031cv::Point first = { 5, int(k * 5 + b) }, second = { int((400 - b) / k), 400 };cv::line(src, first, second, cv::Scalar(0, 0, 255), 2);cv::imshow("name", src);cv::waitKey(0);
}

上面求解出来的结果是k = 1.555569, b = -4.867031。
图像显示结果为:

3.使用opencv自带的函数求解k和b值

void fitline1()
{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++){cicle(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=BMat 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; //b = -4.867031, k = 1.555569,printf("b = %f, k = %f, (%d,%lf)\n", X.at<double>(0, 0), X.at<double>(1, 0), 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);
}

梯度下降法

1.原理

2.举例实现

//梯度下降法进行线性拟合
// y = theta0 * x + theta1
void fitline4(){const int m = 10;double Train_set_x[m] = { 27, 8, 8, 16, 44, 35, 43, 19, 27, 37 };double Train_set_y[m] = { 39, 5, 9, 22, 71, 44, 57, 24, 39, 52 };//alpha是学习率,error是结束误差,theta0就是k,theta1就是b。double theta0 = 0.0, theta1 = 0.0, alpha = 0.002, error = 1e-8; double tmp_theta0 = theta0, tmp_theta1 = theta1;double sum_theta0 = 0.0, sum_theta1 = 0.0;while (1){sum_theta0 = 0.0, sum_theta1 = 0.0;for (size_t i = 0; i < m; i++) {sum_theta0 += (theta0 * Train_set_x[i] + theta1 - Train_set_y[i])*Train_set_x[i]; sum_theta1 += (theta0 * Train_set_x[i] + theta1 - Train_set_y[i]);  //累加和}theta0 = theta0 - alpha * (1.0 / m) * sum_theta0; //k更新公式theta1 = theta1 - alpha * (1.0 / m) * sum_theta1; //b更新公式printf("k=%lf, b=%lf\n", theta0, theta1);if (abs(theta0 - tmp_theta0) < error && abs(theta1 - tmp_theta1) < error){ //break;}tmp_theta0 = theta0;tmp_theta1 = theta1;}
}

结果:

参考:
1.https://blog.csdn.net/stf1065716904/article/details/107594710
2.https://blog.csdn.net/LaplaceSmoothing/article/details/94581854?utm_medium=distribute.pc_relevant.none-task-blog-2defaultCTRLISTdefault-2.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultCTRLISTdefault-2.no_search_link

拟合算法之一 直线拟合相关推荐

  1. RANSAC算法做直线拟合

    RANSAC算法之前了解过相关的原理,这两天利用晚上闲暇的时间,看了一下RANSAC算法的Python代码实现,这方面的资料很多了,这里就不在重复.在分析该RANSAC.py代码之前,想用自己的对RA ...

  2. RANSAC算法实现 + 直线拟合

    一.RANSAC算法 1.参考资料 [1]题目来源与解析:商汤科技SLAM算法岗的RANSAC编程题 [2]牛客网题目:[编程题]线性回归 [3]牛客网解答参考:商汤科技某算法岗的编程题有点过分了啊 ...

  3. 【拟合专题】直线拟合

    闲来无事,整理下拟合方面的一些方法(部分内容参考gloomyfish.Grooveboy等博客,在此先行谢过) 直线拟合方法主流方法有最小二乘.Hough两种,其他如Halcon上的最小距离也是最小二 ...

  4. RANSAC直线拟合和最小二乘直线拟合的简单介绍

           RANSAC是"RANdom SAmple Consensus(随机抽样一致)"的缩写.它可以从一组包含"局外点"的观测数据集中,通过迭代方式估计 ...

  5. RANSAC 直线拟合算法

    1. 参考文献 RANSAC 直线拟合算法 2. 算法实现 #include <iostream> #include <random> #include <vector& ...

  6. 【04】拟合算法:01-拟合算法模型讲解

    第四讲:拟合算法 插值和拟合的区别 一个小例子 确定拟合曲线 最小二乘法的几何解释 求解最小二乘法 Matlab求解最小二乘 如何评价拟合的好坏 证明SST=SSE+SSR "线性函数&qu ...

  7. 直线拟合c语言程序,ax+by+c=0 型直线拟合算法

    所谓直线拟合,通常也叫做线性拟合.一元线性回归.指的是当我们有一批数据(xi,yi),这些数据在平面坐标系下落在一条直线上,或近似的落在一条直线上.我们就要求出这条直线的参数.如果这条直线可以写为: ...

  8. 【自动驾驶】车道线拟合算法---最小二乘法拟合直线

    概览 关于自动驾驶车道线拟合算法,常用的方法有B样条.三次样条插值.Ransac.最小二乘法等等. 但是针对于高精度地图的车道线拟合,由于车道线坐标点已知,所以不需要有控制点进行约束,那么B样条.贝塞 ...

  9. RANSAC算法(附RANSAC直线拟合C++与Python版本)

    文章目录 RANSAC算法简介 RANSAC算法基本思想和流程 迭代次数推导 RANSAC与最小二乘区别 RANSAC直线拟合代码(C++及Python版本) C++版本代码 Python版本代码如下 ...

最新文章

  1. [mqtt]mqtt嵌入式移植
  2. JavaScript的预编译及执行顺序
  3. querySelector
  4. Webpack vs Rollup
  5. Redis集群CentOS系统配置企业级数据备份方案以及数据恢复的操作(在开启AOF功能下恢复冷备RDB文件数据,保持AOF和RDB双开情况下恢复数据及错误的数据恢复步骤详解)
  6. C#架构设计-程序运行时从xml配置文件中加载配置项并设置为全局变量
  7. Java—BIO模型
  8. 如何学好单片机?​嵌入式第一门课
  9. java如何批量导入题目_MyBatis 如何批量插入?
  10. 下面我这个方法可以实现限制某些QQ号登陆,而没有被限制的QQ号可以登陆,不需要借助任何工具。...
  11. pytorch 构造读取数据的工具类 Dataset 与 DataLoader (pytorch Data学习一)
  12. cts(7)---android 8.1 vts环境和测试
  13. 【原创】CPU 100%+磁盘写满 问题排查
  14. android 音频对比,差距只有安卓?索尼Zx300a与505全方位对比
  15. python二元一次方程组用鸡兔同笼的思路来写编程_二元一次方程组的应用一鸡兔同笼问题...
  16. 物联网期末大作业—睡眠质量检测系统(精修版)
  17. namesilo修改域名服务器,Namesilo, godaddy和万网域名修改NS的方法
  18. 共享单车骑行及锁车定位方式分析
  19. 神灵武装908服务器维护,神陵武装127服银河之心开服时间表_神陵武装新区开服预告_第一手游网手游开服表...
  20. 23.2、Android -- OkHttp3 基础学习 自定义设置

热门文章

  1. conda安装torch遇坑
  2. 搭档之家:长租公寓频爆雷,“高收低租”模式背后隐藏着怎样的骗局?
  3. 为什么我们学习一开始就要用utf-8
  4. 阅读《构建之法》并提问
  5. 架构方案(7) 微信、淘宝类扫码登录实现原理解析
  6. 递归——线性递归与二分递归
  7. Matlab常用数值计算函数总结
  8. cloud-init中NoCloud配置
  9. 经典文案的两个万能套路,恭喜你在发文前看见了| 黎想
  10. python程序开机自启动_python 设置开机启动脚本