最小二乘法【一】

最小二乘法(又称***最小平方法***)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。

  1. 为了更好的理解这个方法,我来举一个栗子。比如你今天晚上吃的很多,想去称一下自己的体重。于是站到体重称上去称一下,体重器显示65(kg),你心想:怎么这么重!一定是体重称下的地面不平。于是你挪动了一下体重称,又称了以下,66(kg)! “这不可能!”你说,“肯定是体重秤坏了”。你又去楼下商店去称…

  2. 假设你这几次称的体重为:X1 = 65,X2 = 66,X3=64 …(单位:kg)
    现在问题来了,那我现在究竟是多重呢?我该取哪个值作为我的体重更合适?
    按照你的直觉你应该会取这些体重值的平均值:
    在这里插入图片描述

    那这样做到底对不对呢?我们来看一下最小二乘法是怎样做的。

  3. 最小二乘法

    假设你真实的体重是X,这个数值真正是多少没人知道,你只能通过测量来估计。根据前面讲的,你几次的测量值为:X1 = 65,X2 = 66,X3=64 …(单位:kg)。那你每次测量的的误差|X-Xi|,为了计算方便我们去误差的平方(这也就是二乘or平方的来源)。
    在这里插入图片描述

最小二乘法就是说当我们实验的次数趋向无穷大时(N->+∞,如果总体空间有无穷大)这个误差的和ε最小时的X值就是真值,也就是说能让ε取最小值时的X就是真值。但是我们不可能做无穷次实验,所以我们每次做有限次实验并且根据最小二乘法得到的X值,都是真值的无偏估计,我们认为这个估计值就能代表真值,并且这些无偏估计值的期望值就是真值

下面我们算一下ε的最小值,我们可以看出来,当X小于真值时ε会变大,当X大于真值时ε也会变大,所以ε存在最小值。下面给出过程:
在这里插入图片描述

这时我们可以发现,之前我们的用平均值来作为我们体重的估计值是正确的!

另外:算数平均值是最小二乘法的一个特殊情况。

最小二乘法是一种常用的数学方法,用于拟合数据点到一个函数曲线的最佳拟合线。下面是一个使用最小二乘法进行一元二次拟合的C语言程序的简单示例: ```c #include <stdio.h> // 定义最小二乘法函数 void leastSquares(int n, double x[], double y[], double *a, double *b, double *c) { double sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0, sumX3 = 0, sumX4 = 0; for (int i = 0; i < n; i++) { sumX += x[i]; sumY += y[i]; sumXY += x[i] * y[i]; sumX2 += x[i] * x[i]; sumX3 += x[i] * x[i] * x[i]; sumX4 += x[i] * x[i] * x[i] * x[i]; } double det = n * sumX2 * sumX4 + 2 * sumX * sumX3 * sumX2 - sumX2 * sumX2 * sumX2 - n * sumX3 * sumX3 - sumX * sumX * sumX4; *a = (sumY * sumX2 * sumX4 + sumXY * sumX3 * sumX2 + sumXY * sumX2 * sumX3 - sumY * sumX3 * sumX3 - sumXY * sumX2 * sumX2 - n * sumXY * sumX4) / det; *b = (n * sumXY * sumX4 + sumY * sumX3 * sumX2 + sumX * sumX2 * sumXY - sumX2 * sumX2 * sumXY - sumY * sumX2 * sumX4 - sumX * sumXY * sumX3) / det; *c = (n * sumX2 * sumXY + sumX * sumY * sumX4 + sumX3 * sumX2 * sumXY - sumX2 * sumY * sumX3 - sumX * sumX2 * sumXY - n * sumX4 * sumXY) / det; } int main() { int n = 5; // 数据点的个数 double x[] = {1, 2, 3, 4, 5}; // x坐标数组 double y[] = {2, 5, 9, 15, 23}; // y坐标数组 double a, b, c; // 二次曲线的系数 leastSquares(n, x, y, &a, &b, &c); printf("拟合的二次曲线方程为:y = %.2fx^2 + %.2fx + %.2f\n", a, b, c); return 0; } ``` 这个程序通过最小二乘法拟合给定的数据点,得到了一条二次曲线的方程。你可以根据自己的需求修改数据点的个数和坐标数组,然后运行程序得到相应的拟合结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值