1.  前言

最近断断续续重温了一些数学书,有高等数学,也有初等数学。

有时候,觉得数学才是世界上最美的东西,但有时候又觉得数学很高冷,不接地气。

不过,前段时间工作中用到了最小二乘法,下面记录一些用法。

2. 最小二乘法

根据维基百科的说明:

最小二乘法 (又称 最小平方法 )是一种 数学 优化 技术。
它通过最小化 误差 的平方和寻找数据的最佳 函数 匹配。
利用 最小二乘法 可以简便地求得未知的数据,
并使得这些求得的数据与实际数据之间误差的平方和为最小。

看了之后一头雾水对不对,是的,任何人看着一段不知道在说啥。下面举个例子,就很好懂了。

针对线性最小二乘法即直线拟合,如下图(来自维基百科)所示:

透过这张图,我想大家一定能理解,我们用最小二乘法来做什么事情,即:

根据已有的数据(图中的点),来做出一条最贴近数据发展趋势的直线。

通过这条直线,我们可以对未来的数据进行预测,因为基本会落在这条直线附近。

当然了,最小二乘法不只是直线,还可以是曲线,本文不讨论。

3. 求解直线方程

我们现在要做的,就是求解直线方程。

假设已知有N个点,设这条直线方程为:  y = a·x + b

其中,a和b的计算公式如下:

本文对于推导过程不在赘述,网上都有。

4. 算法代码和效果演示

算法代码如下:

//-------------------------------------------------------------
//功能 : 最小二乘法直线拟合 y = a·x + b, 计算系数a 和 b
//参数 : x -- 辐照度的数组
//       y --  功率的数组
//       num 是数组包含的元素个数,x[]和y[]的元素个数必须相等
//       a,b 都是返回值
//返回 : 拟合计算成功返回true, 拟合计算失败返回false
//作者 :Long
//-------------------------------------------------------------
bool leastSquareLinearFit(float x[], float y[], const int num, float &a, float &b)
{
    float sum_x2 = 0.0;
    float sum_y  = 0.0;
    float sum_x  = 0.0;
    float sum_xy = 0.0;

try {
        for (int i = 0; i < num; ++i) {
            sum_x2 += x[i]*x[i];
            sum_y  += y[i];
            sum_x  += x[i];
            sum_xy += x[i]*y[i];
        }
    } catch (...) {
        return false;
    }

a = (num*sum_xy - sum_x*sum_y)/(num*sum_x2 - sum_x*sum_x);
    b = (sum_x2*sum_y - sum_x*sum_xy)/(num*sum_x2-sum_x*sum_x);

return true;
}

数据样本:

x

float temp[96] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.46667, 11.4667, 31.6, 52.7333, 80.3333, 116.333, 156.6, 199.4, 242.2, 283.4, 329.2, 379.333, 431.333, 482.6, 541, 594.4, 643.533, 692.133, 736.267, 772.667, 810.133, 841.867, 868.2, 892.4, 917.667, 939.8, 954.667, 969, 976.8, 983.4, 987.467, 994.933, 1023.67, 875.2, 873.933, 758.8, 678.2, 515.867, 782.533, 908.8, 779.2, 831.4, 645.533, 734.067, 679.533, 610.267, 565.067, 512.467, 462, 405.2, 354.133, 302, 247.8, 191.533, 140, 94.2667, 57.5333, 25.9333, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // x

y

float tempy[96] = {0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 1.785, 2.57833, 3.927, 5.79233, 7.379, 9.48133, 11.1473, 12.4167, 13.6627, 16.193701, 18.248699, 19.042, 19.042, 19.105301, 16.6383, 17.240999, 14.631, 11.8217, 11.663, 12.155, 15.488, 21.859301, 19.32, 19.042, 19.6133, 21.105, 22.9937, 20.827299, 23.858299, 23.0333, 19.2883, 15.6937, 21.5893, 23.802999, 20.518299, 21.5893, 17.907301, 17.971001, 17.574301, 16.781, 15.5513, 12.3773, 10.2747, 8.60867, 6.86333, 5.39567, 3.88767, 2.856, 2.142, 2.142, 0.952, 0.952, 0.952, 0.952, 0.952, 0.952, 0.952, 0.952, 0.952, 0.952, 0.952, 0.952, 0.952, 0.952 }; // y

计算结果:

a = 0.0215136

b = 0.608488

效果如下:

------

最小二乘法的C语言实现相关推荐

  1. 最小二乘法 c 语言程序,最小二乘法采用C语言.docx

    最小二乘法 C 语言 1.实验目的: 进一步熟悉曲线拟合的最小二乘法. 掌握编程语言字符处理程序的设计和调试技术. 2.实验要求: 输入:已知点的数目以及各点坐标 . 输出:根据最小二乘法原理以及各点 ...

  2. 最小二乘法幂函数C语言,跪求最小二乘法幂函数C 语言程序

    满意答案 mj43976914 2014.10.25 采纳率:44%    等级:7 已帮助:311人 最小二乘法是统计学里的东西额..怎么又幂函数?我猜想你是要logn复杂度的乘方快速幂吧: //a ...

  3. 曲线拟合最小二乘法对数c语言实现,数值计算_第6章曲线拟合的最小二乘法

    <数值计算_第6章曲线拟合的最小二乘法>由会员分享,可在线阅读,更多相关<数值计算_第6章曲线拟合的最小二乘法(23页珍藏版)>请在人人文库网上搜索. 1.第6章 曲线拟合的最 ...

  4. 最小二乘法曲线拟合 C语言实现

    简单思路如下: 1,采用目标函数对多项式系数求偏导,得到最优值条件,组成一个方程组: 2,方程组的解法采用行列式变换(两次变换:普通行列式--三角行列式--对角行列式--求解),行列式的求解算法上优化 ...

  5. 最小二乘法实验c语言实现,最小二乘法拟合C语言实现

    拟合直线 #include #include #include #include float average(int n,float *x) {int i; float av; av=0; for(i ...

  6. 最小二乘法抛物线 c语言,C语言实现最小二乘法抛物线拟合

    C语言实现,已通过matlab对比验证: /****************************************************************************** ...

  7. 一元最小二乘法(c语言实现)

    文章目录 一元最小二乘法 python画图验证 数据集 一元最小二乘法

  8. 最小二乘法预测c语言,用最小二乘法推导本吧会员增长方程,以预测人数增长情况...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 2楼,在只有一组实验数据,并无其他任何可以辅助进行方程猜测的情况下,线性方程无疑是首选,哪怕进行排除,也要先排除线性关系.,,,这里,我并没有根据数据进行 ...

  9. 两阶段最小二乘法原理_R语言代写工具变量与两阶段最小二乘法

    我们要估计的模型是 y=a+bx+cd+ey=a+bx+cd+e, 其中是解释变量,,和是我们想要估计的系数.是控制变量,是治疗变量.我们特别关注我们的治疗效果对. 生成数据 首先,让我们生成数据. ...

最新文章

  1. iOS App上架流程
  2. 阿里云平台注册与使用Linux
  3. Silverlight从客户端上传文件到服务器
  4. matlab计算hessian矩阵
  5. java ios压缩_iOS与Java服务器GZip压缩问题【转】
  6. Linux rpm 命令参数使用详解[介绍和应用](转)
  7. c语言中编译链接机制
  8. vc6.0安装过程中出现的问题——解决
  9. Cmake使用示例与整理
  10. InnoDB存储引擎
  11. PTA数据结构-01-复杂度1 最大子列和问题
  12. ISA防火墙规则练习
  13. 人类DNA国标-中英对照表
  14. 华为Android10怎样root,华为M2平板10.0怎么ROOT 华为M2超级权限图文教程
  15. 实现多线程的方法到底有1种还是2种还是4种?
  16. 鸿蒙系统专利申请,华为在欧盟申请HarmonyOS专利 或为鸿蒙系统的英文名称
  17. java锁的种类以及辨析(一):自旋锁
  18. 蓝牙打开和搜索并显示在列表
  19. 移动端Web页面问题解决方案
  20. SimpleDateFormat的使用

热门文章

  1. 2012.07.11
  2. web学习 -- w3c dom标准
  3. android studio提示HAXM device is not found或者could not start avd
  4. php 框架的作用,ThinkPHP框架作用
  5. c语言性格测试小游戏,性格测试小游戏
  6. 机器学习——KNN分类器的学习
  7. 永恒之蓝漏洞利用攻击以及修复方法
  8. Reverse(制作倒放视频手机软件)专业版V1.4.0.40 | 极品视频倒放功能app | Reverse倒放神器app下载
  9. 盈建科弹性板6计算_常见的盈建科计算参数理解.ppt
  10. java计算百分比值的方法