C++:最小二乘法 拟合直线
分享给有需要的人,代码质量勿喷。
一、y = k * x + b
bool xjLeastSquares::xjFitLineByLeastSquares(
std::vector<double> &xjParameters, const std::vector<xjPoint> &xjData,const bool &kxb)
{try{xjParameters.clear();if (xjData.size() < 2)return false;double k = 0, b = 0;int xjPcount = xjData.size();double sumX = 0.0, sumY = 0.0;double sumXX = 0.0, sumXY = 0.0;for (int i = 0; i < xjPcount; i++){sumX += xjData[i].x;sumY += xjData[i].y;sumXX += xjData[i].x * xjData[i].x;sumXY += xjData[i].x * xjData[i].y;}double deltaX = sumXX * xjPcount - sumX * sumX;if (std::abs(deltaX) > 1e-15)/* 防止竖直线 */{k = (sumXY*xjPcount - sumX * sumY) / deltaX;b = (sumXX*sumY - sumX * sumXY) / deltaX;}xjParameters.push_back(k);xjParameters.push_back(b);return true;}catch (const std::exception&){return false;}
}
二、AX + BY + C = 0
参考自 Ziv Yaniv
/* 最小二乘法拟合直线:AX+BY+C=0 */
bool xjLeastSquares::xjFitLineByLeastSquares(
std::vector<double> &xjParameters, const std::vector<xjPoint> &xjData)
{try{xjParameters.clear();if (xjData.size() < 2)return false;double A = 0.0, B = 0.0, C = 0.0;int xjPcount = xjData.size();double meanX = 0.0, meanY = 0.0;double sumXX = 0.0, sumXY = 0.0, sumYY = 0.0;for (int i = 0; i < xjPcount; i++){meanX += xjData[i].x;meanY += xjData[i].y;sumXX += xjData[i].x * xjData[i].x;sumXY += xjData[i].x * xjData[i].y;sumYY += xjData[i].y * xjData[i].y;}meanX /= xjPcount;meanY /= xjPcount;sumXX -= xjPcount * meanX*meanX;sumXY -= xjPcount * meanX*meanY;sumYY -= xjPcount * meanY*meanY;if (abs(sumXX) < 1e-15){A = 1.0;B = 0.0;}else{double ev = (sumXX + sumYY + sqrt((sumXX - sumYY)*(sumXX - sumYY) + 4 * sumXY*sumXY)) / 2.0;A = -sumXY;B = ev - sumYY;double norm = sqrt(A*A + B * B);A /= norm;B /= norm;}xjParameters.push_back(A);xjParameters.push_back(B);C = -(A * meanX + B * meanY);xjParameters.push_back(C);return true;}catch (const std::exception&){return false;}
}
三、结果
两个公式的结果可能会略有差异。
C++:最小二乘法 拟合直线相关推荐
- C++:最小二乘法拟合直线
原理: 代码: #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp>using names ...
- Python实现最小二乘法拟合直线(求斜率截距)
利用最小二乘法拟合直线,实现了对一系列点拟合出其最接近的直线,并给出公式,包括斜率和截距.并且绘制出最终拟合线. 完整代码如下: # 核心代码,求斜率w,截距b def fit(data_x, dat ...
- 最小二乘法拟合直线 C++/OpenCV
问题: 我们在拥有一系列散列的点(x1,y1),(x2,y2)... (xm,ym),这些点在一条直线附近,通过点拟合直线. 我在工程中是要拟合一系列线段,其实一条线段就对应着两个要拟合的点,算法上稍 ...
- 最小二乘法拟合直线簇交点及Ransac拟合
最小二乘法拟合直线簇交点及Ransac拟合 最小二乘法的实现 Ransac优化 语言环境:Python 直线簇方程: y=p→+v→∗ty=\overrightarrow p+\overrightar ...
- opencv学习——最小二乘法拟合直线
最小二乘法拟合直线 概念:最小二乘法多项式直线拟合,根据给定的点,求出它的函数y=f(x),当然求得准确的函数是不太可能的,但是我们能求出它的近似曲线y=φ(x) 原理 假设有点 , I = 1,2 ...
- C++opencv实现最小二乘法拟合直线和平面
使用opencv中的Mat实现用矩阵的方式根据最小二乘法拟合直线和平面方程,但是好像不能实现拟合斜率无穷大的直线和平面方程,后续再改进吧. 有关于原理部分,有时间再详细写一下. #include &q ...
- matlab直线拟合的程序,MATLAB最小二乘法拟合直线的程序
最小二乘法拟合直线 程序: function linear_fit %最小二乘法拟合直线clear; clc; prompt={'Name of data file'}; title='Linear_ ...
- 最小二乘法拟合直线——MATLAB和Qt-C++实现
本节Jungle用C++实现最小二乘法拟合平面直线. 1.理论知识 平面直线的通用方程可以表示为 A+Bx-y=0 其中,A是直线的截距,B是直线的斜率.对于测量的二维坐标(x,y),x是精确分布的, ...
- python最小二乘法拟合直线
最小二乘法的推导可参考下面这个博客,推导非常详细. https://my.oschina.net/keyven/blog/526010 首先画一个加入了噪声的散点图,函数是y=0.2x,加入噪声后如下 ...
最新文章
- String类常用方法(看一眼就懂)
- spring:《spring实战》读后感一
- 解析Objective-C中多态、动态类型和动态绑定
- Ubuntu 循环显示登录界面
- 服务器2003添加共享文档权限,Windows2003使用命令行设置共享权限与安全权限心得...
- 互联网1分钟 | 1011
- P3368-Frequent values【线段树】
- springboot-29-security(二)用户角色权限控制
- 【图论】Dijkstra算法解决有向图最短路问题
- Druid创始人Eric Tschetter详解开源实时大数据分析系统Druid
- 移动端一倍图,二倍图尺寸
- 独家深挖!F1赛车协会“刹车表现”是如何进行数据分析的?
- Windows 10环境下TensorFlow(gpu版本)配置教程——[图解] [详细版][零基础]
- 小学五年级如何引导学计算机,怎么教五年级小孩数学
- 关于H5闪退问题--资源优化
- UE4 UDP是如何进行可靠传输的
- oracle 导出数据 utl,oracle 使用 UTL_FILE 导出表数据到txt文件
- 【毕业设计】2-基于单片机控制的直流电机调速系统设计(原理图+仿真+答辩论文+答辩PPT)
- 【最新免费】CCNA中文注释题库精选模拟题
- es6转换es5 babel配置