【数学】什么是最小二乘法?如何求解最小二乘法?

2024-06-15 07:04
文章标签 最小 数学 求解 乘法

本文主要是介绍【数学】什么是最小二乘法?如何求解最小二乘法?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

最小二乘法(Least Squares Method)是一种用于找到数据点最佳拟合曲线的数学优化技术。它通过最小化数据点和拟合曲线之间的误差平方和来实现。广泛应用于统计学、数据分析和机器学习中。

公式

最小二乘法的基本公式如下:

  1. 线性回归模型:
    y ^ = β 0 + β 1 x \hat{y} = \beta_0 + \beta_1 x y^=β0+β1x
  2. 误差平方和(SSE):
    S S E = ∑ i = 1 n ( y i − y ^ i ) 2 = ∑ i = 1 n ( y i − ( β 0 + β 1 x i ) ) 2 SSE = \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 = \sum_{i=1}^{n} (y_i - (\beta_0 + \beta_1 x_i))^2 SSE=i=1n(yiy^i)2=i=1n(yi(β0+β1xi))2
  3. 通过求解最小化误差平方和,得出最佳拟合参数:
    β 1 = n ∑ ( x i y i ) − ∑ x i ∑ y i n ∑ x i 2 − ( ∑ x i ) 2 \beta_1 = \frac{n \sum (x_i y_i) - \sum x_i \sum y_i}{n \sum x_i^2 - (\sum x_i)^2} β1=nxi2(xi)2n(xiyi)xiyi
    β 0 = ∑ y i − β 1 ∑ x i n \beta_0 = \frac{\sum y_i - \beta_1 \sum x_i}{n} β0=nyiβ1xi

示例题目

假设我们有以下数据点: ( 1 , 2 ) (1, 2) (1,2) ( 2 , 3 ) (2, 3) (2,3) ( 3 , 5 ) (3, 5) (3,5) ( 4 , 4 ) (4, 4) (4,4) ( 5 , 6 ) (5, 6) (5,6)。求最佳拟合直线。

详细讲解

  1. 计算必要的求和:
    ∑ x i = 1 + 2 + 3 + 4 + 5 = 15 \sum x_i = 1 + 2 + 3 + 4 + 5 = 15 xi=1+2+3+4+5=15
    ∑ y i = 2 + 3 + 5 + 4 + 6 = 20 \sum y_i = 2 + 3 + 5 + 4 + 6 = 20 yi=2+3+5+4+6=20
    ∑ x i 2 = 1 2 + 2 2 + 3 2 + 4 2 + 5 2 = 55 \sum x_i^2 = 1^2 + 2^2 + 3^2 + 4^2 + 5^2 = 55 xi2=12+22+32+42+52=55
    ∑ x i y i = 1 ⋅ 2 + 2 ⋅ 3 + 3 ⋅ 5 + 4 ⋅ 4 + 5 ⋅ 6 = 70 \sum x_i y_i = 1 \cdot 2 + 2 \cdot 3 + 3 \cdot 5 + 4 \cdot 4 + 5 \cdot 6 = 70 xiyi=12+23+35+44+56=70

  2. 计算斜率 β 1 \beta_1 β1
    β 1 = 5 ⋅ 70 − 15 ⋅ 20 5 ⋅ 55 − 1 5 2 = 350 − 300 275 − 225 = 50 50 = 1 \beta_1 = \frac{5 \cdot 70 - 15 \cdot 20}{5 \cdot 55 - 15^2} = \frac{350 - 300}{275 - 225} = \frac{50}{50} = 1 β1=5551525701520=275225350300=5050=1

  3. 计算截距 β 0 \beta_0 β0
    β 0 = 20 − 1 ⋅ 15 5 = 5 5 = 1 \beta_0 = \frac{20 - 1 \cdot 15}{5} = \frac{5}{5} = 1 β0=520115=55=1

  4. 最佳拟合直线方程为:
    y ^ = 1 + 1 x = x + 1 \hat{y} = 1 + 1x = x + 1 y^=1+1x=x+1

Python代码求解

import numpy as np
import matplotlib.pyplot as plt# 数据点
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 3, 5, 4, 6])# 最小二乘法计算
A = np.vstack([x, np.ones(len(x))]).T
beta, beta_0 = np.linalg.lstsq(A, y, rcond=None)[0]# 绘图
plt.plot(x, y, 'o', label='原始数据', markersize=10)
plt.plot(x, beta * x + beta_0, 'r', label='拟合直线')
plt.legend()
plt.show()

实际生活中的例子

在经济学中,最小二乘法可以用来预测消费支出与收入之间的关系。例如,根据历史数据,使用最小二乘法可以拟合出消费支出与收入的关系直线,从而预测未来的消费行为。

这篇关于【数学】什么是最小二乘法?如何求解最小二乘法?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1062748

相关文章

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];

poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)

题目很麻烦,因为不熟悉最小生成树的算法调试了好久。 感觉网上的题目解释都没说得很清楚,不适合新手。自己写一个。 题意:给你点的坐标,然后两点间可以有两种方式来通信:第一种是卫星通信,第二种是无线电通信。 卫星通信:任何两个有卫星频道的点间都可以直接建立连接,与点间的距离无关; 无线电通信:两个点之间的距离不能超过D,无线电收发器的功率越大,D越大,越昂贵。 计算无线电收发器D

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

uva 11044 Searching for Nessy(小学数学)

题意是给出一个n*m的格子,求出里面有多少个不重合的九宫格。 (rows / 3) * (columns / 3) K.o 代码: #include <stdio.h>int main(){int ncase;scanf("%d", &ncase);while (ncase--){int rows, columns;scanf("%d%d", &rows, &col

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

hdu 1102 uva 10397(最小生成树prim)

hdu 1102: 题意: 给一个邻接矩阵,给一些村庄间已经修的路,问最小生成树。 解析: 把已经修的路的权值改为0,套个prim()。 注意prim 最外层循坏为n-1。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstri