最近公司的一个项目需要计算TVDI(Temperature Vegetation Dryness Index ,温度植被干旱指数) ,TVDI的计算公式如下(具体原理自行百度):

其中,为任意像元的地表温度;为某一NDVI对应的最小地表温度,对应的是湿边为某一NDVI对应的最大地表温度,对应的是干边;a,b为湿边的拟合方程系数,c,d为干边的拟合方程系数。

在拟合干边和湿边的过程中,需要利用最小二乘方法来对有效的NDVI和Lst数据来进行线性拟合。因此,本文记录在工作中用C++实现的最小二乘拟合直线,关键是理解最小二乘拟合直线的基本原理,实现起来比较简单。具体的最小二乘原理再此不做过多的阐述,网上有大量的介绍资料,这里只给出形如的线性回归计算a,b系数以及r^2的最终计算公式,相关代码如下:

/*************************************************************************最小二乘法拟合直线,y = a*x + b; n组数据; r-相关系数[-1,1],fabs(r)->1,说明x,y之间线性关系好,fabs(r)->0,x,y之间无线性关系,拟合无意义a = (n*C - B*D) / (n*A - B*B)b = (A*D - B*C) / (n*A - B*B)r = E / F其中:A = sum(Xi * Xi)B = sum(Xi)C = sum(Xi * Yi)D = sum(Yi)E = sum((Xi - Xmean)*(Yi - Ymean))F = sqrt(sum((Xi - Xmean)*(Xi - Xmean))) * sqrt(sum((Yi - Ymean)*(Yi - Ymean)))**************************************************************************/
void LineFitLeastSquares(float *data_x, float *data_y, int data_n, vector<float> &vResult)
{float A = 0.0;float B = 0.0;float C = 0.0;float D = 0.0;float E = 0.0;float F = 0.0;for (int i=0; i<data_n; i++){A += data_x[i] * data_x[i];B += data_x[i];C += data_x[i] * data_y[i];D += data_y[i];}// 计算斜率a和截距bfloat a, b, temp = 0;if( temp = (data_n*A - B*B) )// 判断分母不为0{a = (data_n*C - B*D) / temp;b = (A*D - B*C) / temp;}else{a = 1;b = 0;}// 计算相关系数rfloat Xmean, Ymean;Xmean = B / data_n;Ymean = D / data_n;float tempSumXX = 0.0, tempSumYY = 0.0;for (int i=0; i<data_n; i++){tempSumXX += (data_x[i] - Xmean) * (data_x[i] - Xmean);tempSumYY += (data_y[i] - Ymean) * (data_y[i] - Ymean);E += (data_x[i] - Xmean) * (data_y[i] - Ymean);}F = sqrt(tempSumXX) * sqrt(tempSumYY);float r;r = E / F;vResult.push_back(a);vResult.push_back(b);vResult.push_back(r*r);
}

为了验证该算法的有效性,给出如下测试数据,数据来源为某论文的实验数据:

float pY[25] = { 10.98, 11.13, 12.51, 8.40, 9.27,8.73, 6.36, 8.50, 7.82, 9.14,8.24, 12.19, 11.88, 9.57, 10.94,9.58, 10.09, 8.11, 6.83, 8.88,7.68, 8.47, 8.86, 10.38, 11.08 };float pX[25] = { 35.3, 29.7, 30.8, 58.8, 61.4,71.3, 74.4, 76.6, 70.7, 57.5,46.4, 28.9, 28.1, 39.1, 46.8,48.5, 59.3, 70.0, 70.0, 74.5,72.1, 58.1, 44.6, 33.4, 28.6 };

该数据在Excel的拟合结果为,其中

第一次发CSDN博客,不足之处请各位多多指教。

最小二乘法拟合直线-C++实现相关推荐

  1. C++:最小二乘法拟合直线

     原理: 代码: #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp>using names ...

  2. Python实现最小二乘法拟合直线(求斜率截距)

    利用最小二乘法拟合直线,实现了对一系列点拟合出其最接近的直线,并给出公式,包括斜率和截距.并且绘制出最终拟合线. 完整代码如下: # 核心代码,求斜率w,截距b def fit(data_x, dat ...

  3. 最小二乘法拟合直线 C++/OpenCV

    问题: 我们在拥有一系列散列的点(x1,y1),(x2,y2)... (xm,ym),这些点在一条直线附近,通过点拟合直线. 我在工程中是要拟合一系列线段,其实一条线段就对应着两个要拟合的点,算法上稍 ...

  4. 最小二乘法拟合直线簇交点及Ransac拟合

    最小二乘法拟合直线簇交点及Ransac拟合 最小二乘法的实现 Ransac优化 语言环境:Python 直线簇方程: y=p→+v→∗ty=\overrightarrow p+\overrightar ...

  5. opencv学习——最小二乘法拟合直线

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

  6. C++opencv实现最小二乘法拟合直线和平面

    使用opencv中的Mat实现用矩阵的方式根据最小二乘法拟合直线和平面方程,但是好像不能实现拟合斜率无穷大的直线和平面方程,后续再改进吧. 有关于原理部分,有时间再详细写一下. #include &q ...

  7. C++:最小二乘法 拟合直线

    分享给有需要的人,代码质量勿喷. 一.y = k * x + b bool xjLeastSquares::xjFitLineByLeastSquares( std::vector<double ...

  8. matlab直线拟合的程序,MATLAB最小二乘法拟合直线的程序

    最小二乘法拟合直线 程序: function linear_fit %最小二乘法拟合直线clear; clc; prompt={'Name of data file'}; title='Linear_ ...

  9. 最小二乘法拟合直线——MATLAB和Qt-C++实现

    本节Jungle用C++实现最小二乘法拟合平面直线. 1.理论知识 平面直线的通用方程可以表示为 A+Bx-y=0 其中,A是直线的截距,B是直线的斜率.对于测量的二维坐标(x,y),x是精确分布的, ...

  10. python最小二乘法拟合直线

    最小二乘法的推导可参考下面这个博客,推导非常详细. https://my.oschina.net/keyven/blog/526010 首先画一个加入了噪声的散点图,函数是y=0.2x,加入噪声后如下 ...

最新文章

  1. robomaster视觉组代码中的一些函数
  2. Jest 测试框架 expect 和 匹配器 matcher 的设计原理解析
  3. linux shell之awk
  4. scala中抽象类_Scala中的抽象类
  5. python查找并修改文件中的内容_如何使用Python搜索和替换文件中的文本?
  6. 实验一 命令解释程序编写
  7. H3CSE园区-VLAN配置
  8. P4173 残缺的字符串(FFT)
  9. android 编译libjpeg-turbo
  10. 浙江印发政府数字化转型工作方案,多处提及电子签名、签章、印章
  11. 矩阵对角线求和C++
  12. STM32使用DMA在Normal模式下二次传输
  13. Redis设计与实现-笔记(一)
  14. 电视android已停止运行,智能电视提示应用停止运行 三种方法亲测有效
  15. 苹果新品“翻车”后,官方回应来了!
  16. 南宁市信息化项目验收方案
  17. 一文看懂EtherCAT总线控制
  18. 矩阵分析与多元统计II 二次型与二次曲面1 线性函数与对偶空间
  19. Jennifer Smith加入Brightcove担任首席营销官
  20. 如何用沉浸式叙事做品牌营销|技术就是沉浸式的全部吗?

热门文章

  1. 视频教程-ThreeJS视频教程-JavaScript
  2. android应用程序开发另解及Android SDK工具集的另类用法 .
  3. 基于Qt的抽奖小程序
  4. android开源播放器代码,github上十二款最著名的Android播放器开源项目
  5. c语言标准版表白代码教程,C语言告白代码,一闪一闪亮晶晶~
  6. Web漏洞扫描工具:AWVS下载
  7. [c#]喜马拉雅FM音频批量下载器开发手记
  8. MySQL图书管理系统设计
  9. 免费分享9本经典的MySQL书籍。
  10. opera官方教程 预订二