最小二乘法的C语言实现
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语言实现相关推荐
- 最小二乘法 c 语言程序,最小二乘法采用C语言.docx
最小二乘法 C 语言 1.实验目的: 进一步熟悉曲线拟合的最小二乘法. 掌握编程语言字符处理程序的设计和调试技术. 2.实验要求: 输入:已知点的数目以及各点坐标 . 输出:根据最小二乘法原理以及各点 ...
- 最小二乘法幂函数C语言,跪求最小二乘法幂函数C 语言程序
满意答案 mj43976914 2014.10.25 采纳率:44% 等级:7 已帮助:311人 最小二乘法是统计学里的东西额..怎么又幂函数?我猜想你是要logn复杂度的乘方快速幂吧: //a ...
- 曲线拟合最小二乘法对数c语言实现,数值计算_第6章曲线拟合的最小二乘法
<数值计算_第6章曲线拟合的最小二乘法>由会员分享,可在线阅读,更多相关<数值计算_第6章曲线拟合的最小二乘法(23页珍藏版)>请在人人文库网上搜索. 1.第6章 曲线拟合的最 ...
- 最小二乘法曲线拟合 C语言实现
简单思路如下: 1,采用目标函数对多项式系数求偏导,得到最优值条件,组成一个方程组: 2,方程组的解法采用行列式变换(两次变换:普通行列式--三角行列式--对角行列式--求解),行列式的求解算法上优化 ...
- 最小二乘法实验c语言实现,最小二乘法拟合C语言实现
拟合直线 #include #include #include #include float average(int n,float *x) {int i; float av; av=0; for(i ...
- 最小二乘法抛物线 c语言,C语言实现最小二乘法抛物线拟合
C语言实现,已通过matlab对比验证: /****************************************************************************** ...
- 一元最小二乘法(c语言实现)
文章目录 一元最小二乘法 python画图验证 数据集 一元最小二乘法
- 最小二乘法预测c语言,用最小二乘法推导本吧会员增长方程,以预测人数增长情况...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 2楼,在只有一组实验数据,并无其他任何可以辅助进行方程猜测的情况下,线性方程无疑是首选,哪怕进行排除,也要先排除线性关系.,,,这里,我并没有根据数据进行 ...
- 两阶段最小二乘法原理_R语言代写工具变量与两阶段最小二乘法
我们要估计的模型是 y=a+bx+cd+ey=a+bx+cd+e, 其中是解释变量,,和是我们想要估计的系数.是控制变量,是治疗变量.我们特别关注我们的治疗效果对. 生成数据 首先,让我们生成数据. ...
最新文章
- iOS App上架流程
- 阿里云平台注册与使用Linux
- Silverlight从客户端上传文件到服务器
- matlab计算hessian矩阵
- java ios压缩_iOS与Java服务器GZip压缩问题【转】
- Linux rpm 命令参数使用详解[介绍和应用](转)
- c语言中编译链接机制
- vc6.0安装过程中出现的问题——解决
- Cmake使用示例与整理
- InnoDB存储引擎
- PTA数据结构-01-复杂度1 最大子列和问题
- ISA防火墙规则练习
- 人类DNA国标-中英对照表
- 华为Android10怎样root,华为M2平板10.0怎么ROOT 华为M2超级权限图文教程
- 实现多线程的方法到底有1种还是2种还是4种?
- 鸿蒙系统专利申请,华为在欧盟申请HarmonyOS专利 或为鸿蒙系统的英文名称
- java锁的种类以及辨析(一):自旋锁
- 蓝牙打开和搜索并显示在列表
- 移动端Web页面问题解决方案
- SimpleDateFormat的使用
热门文章
- 2012.07.11
- web学习 -- w3c dom标准
- android studio提示HAXM device is not found或者could not start avd
- php 框架的作用,ThinkPHP框架作用
- c语言性格测试小游戏,性格测试小游戏
- 机器学习——KNN分类器的学习
- 永恒之蓝漏洞利用攻击以及修复方法
- Reverse(制作倒放视频手机软件)专业版V1.4.0.40 | 极品视频倒放功能app | Reverse倒放神器app下载
- 盈建科弹性板6计算_常见的盈建科计算参数理解.ppt
- java计算百分比值的方法