线性拟合笔记之:最小二乘法

关于最小二乘法

以下是百度百科的解释:最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。
对于线性拟合,给定的具有线性关系的观测样本,可以通过最小二乘法求解得到线性模型。

一元线性回归模型求解

给定的观测数据 :(x1,y1),(x2,y1),(x3,y3)…(xn,yn),假设其存在着线性关系,线性模型为: y ˉ = w x + b \bar{y} = wx +b yˉ=wx+b
优化目标函数为: L = ∑ i = 1 n ( y i − y i ˉ ) 2 L = \sum^{n}_{i=1}(y_{i}-\bar{y_{i}})^{2} L=i=1n(yiyiˉ)2
即标签值和预测值之间的均方误差,所选择的回归模型应该使所有观察值的残差平方和达到最小,也就是 Least square。
将目标函数展开: L = ∑ i = 1 n ( y i − ( w x i + b ) ) 2 L = \sum _{i=1} ^{n}(y_{i}-(wx_{i} + b)) ^{2} L=i=1n(yi(wxi+b))2
L = ∑ i = 1 n ( y i − w x i − b ) 2 L = \sum _{i=1} ^{n} (y_{i}-wx_{i}-b) ^{2} L=i=1n(yiwxib)2
此时,L是关于wb 的函数,要使 L的值最小,由数学知识可知,可以通过求偏导令为0可解得,即:
∂ L ∂ w = 2 ∑ i = 1 n ( y i − w x i − b ) ( − x i ) = 0 \frac{\partial L}{\partial w} = 2\sum_{i=1}^{n}(y_{i}-wx_{i}-b)(-x_{i})=0 wL=2i=1n(yiwxib)(xi)=0
∂ L ∂ b = 2 ∑ i = 1 n ( y i − w x i − b ) ( − 1 ) = 0 \frac{\partial L}{\partial b} = 2\sum_{i=1}^{n}(y_{i}-wx_{i}-b)(-1)=0 bL=2i=1n(yiwxib)(1)=0

b = ∑ i = 1 n y i − w ∑ i = 1 n x i n b = \frac{\sum_{i=1}^{n}y_{i}-w\sum_{i=1}^{n}x_{i}}{n} b=ni=1nyiwi=1nxi
记: y ˉ = 1 n ∑ i = 1 n y i \bar{y} = \frac{1}{n}\sum_{i=1}^{n}y_{i} yˉ=n1i=1nyi
x ˉ = 1 n ∑ i = 1 n x i \bar{x} = \frac{1}{n}\sum_{i=1}^{n}x_{i} xˉ=n1i=1nxi
b = y ˉ − w x ˉ b = \bar{y} - w\bar{x} b=yˉwxˉ
同理可得:
w = ∑ i = 1 n x i y i − n x ˉ y ˉ ∑ i = 1 n x i 2 − n x ˉ 2 w = \frac{\sum_{i=1}^{n}x_{i}y_{i}-n\bar{x}\bar{y}}{\sum_{i=1}^{n}x_{i}^{2}-n\bar{x}^{2}} w=i=1nxi2nxˉ2i=1nxiyinxˉyˉ
即可求得w,b

最小二乘实现

一元最小二乘法

由上面的 w 可以看出,整个计算结果依赖于 x ˉ \bar{x} xˉ, y ˉ \bar{y} yˉ, x i y i x_{i}y_{i} xiyi, x i 2 x_{i}^{2} xi2
python测试代码如下:

import matplotlib.pyplot as plt
import numpy as np
class Least_square:
    weight = 0
    bias = 0

    def get_weight(self):
        return self.weight

    def get_bias(self):
        return self.bias

    def least_square(self,x,y):
        if len(x)!= len(y):
            print('data error')
            return
        x_ = 0
        y_ = 0
        x_mul_y = 0
        x_2 = 0
        n = len(x)
        for i in range(n):
            x_ = x[i] + x_
            y_ = y[i] + y_
            x_mul_y = x[i]*y[i] + x_mul_y
            x_2 = x[i]*x[i] + x_2
        x_ = x_ / n
        y_ = y_ / n
        self.weight = (x_mul_y - n*x_*y_)/(x_2 - n*x_*x_)
        self.bias = y_ - self.weight*x_

    def fun_plot(self):
        data_x = np.linspace(0,10,20)
        data_y = [self.weight * x +self.bias for x in data_x]
        print('y='+str(self.weight)+'x+'+str(self.bias))
        plt.plot(data_x,data_y)
        plt.show()

test = Least_square()
x = np.array([1,2,3,6,1.5,4,7,4.3,9.2])
y = np.array([2,1.5,4,7,1.8,5.3,8.6,5.6,11])
plt.plot(x,y,'ro')
test.least_square(x,y)
test.fun_plot()

运行结果示例:
在这里插入图片描述
因为最小二乘法是对所有数据进行拟合,寻找到所有点的误差最小的直线,当数据不存在大的异常点时,效果应该是很好的。
如下图,当增加一个明显的异常点(蓝色点)时,拟合的直线会靠向异常点
在这里插入图片描述

多元线性回归模型

百度百科:在回归分析中,如果有两个或两个以上的自变量,就称为多元回归。事实上,一种现象常常是与多个因素相联系的,由多个自变量的最优组合共同来预测或估计因变量,比只用一个自变量进行预测或估计更有效,更符合实际。因此多元线性回归比一元线性回归的实用意义更大。

记多元线性回归模型为:
y = w 0 + w 1 x i 1 + w 2 x i 2 + . . . + w p x i p y = w_{0}+w_{1}x_{i1}+w_{2}x_{i2}+...+w_{p}x_{ip} y=w0+w1xi1+w2xi2+...+wpxip
已有的观测数据: ( x 1 , y 1 ) , ( x 2 , y 2 ) . . . ( x n , y n ) (x_{1},y_{1}),(x_{2},y_{2})...(x_{n},y_{n}) (x1,y1),(x2,y2)...(xn,yn),其中 x i = ( x i 1 , x i 2 , . . . , x i p ) x_{i} = (x_{i1},x_{i2},...,x_{ip}) xi=(xi1,xi2,...,xip)
最小化残差平方和函数:
L = ∑ i = 1 n ( y i − y i ˉ ) 2 L = \sum^{n}_{i=1}(y_{i}-\bar{y_{i}})^{2} L=i=1n(yiyiˉ)2
L = ∑ i = 1 n ( y i − w 0 − w 1 x i 1 − w 2 x i 2 − . . . − w p x i p ) 2 L = \sum _{i=1} ^{n}(y_{i}-w_{0}-w_{1}x_{i1}-w_{2}x_{i2}-...-w_{p}x_{ip}) ^{2} L=i=1n(yiw0w1xi1w2xi2...wpxip)2
求偏导:
∂ L ∂ w j = 2 ∑ i = 1 n ( y i − w 0 − w 1 x i 1 − w 2 x i 2 − . . . − w p x i p ) ( − x i j ) = 0 , j = [ 1 , p ] \frac{\partial L}{\partial w_{j}} = 2\sum_{i=1}^{n}(y_{i}-w_{0}-w_{1}x_{i1}-w_{2}x_{i2}-...-w_{p}x_{ip})(-x_{ij})=0,j = [1,p] wjL=2i=1n(yiw0w1xi1w2xi2...wpxip)(xij)=0,j=[1,p]
∂ L ∂ w 0 = 2 ∑ i = 1 n ( y i − w 0 − w 1 x i 1 − w 2 x i 2 − . . . − w p x i p ) ( − 1 ) = 0 \frac{\partial L}{\partial w_{0}} = 2\sum_{i=1}^{n}(y_{i}-w_{0}-w_{1}x_{i1}-w_{2}x_{i2}-...-w_{p}x_{ip})(-1)=0 w0L=2i=1n(yiw0w1xi1w2xi2...wpxip)(1)=0

然后写成:
{ ∑ y i = n w 0 + ∑ x i 1 w 1 + . . . + ∑ x i p w p ∑ x i 1 y i = ∑ x i 1 w 0 + ∑ x i 1 2 w 1 + . . . + ∑ x i 1 x i p w p . . . ∑ x i p y i = ∑ x i p w 0 + ∑ x i p x i 1 w 1 + . . . + ∑ x i p 2 w p \left\{ \begin{array}{lr} \sum y_{i}=nw_{0}+ \sum x_{i1}w_{1}+...+\sum x_{ip}w_{p}\\ \sum x_{i1}y_{i} = \sum x_{i1}w_{0}+\sum x_{i1}^{2}w_{1}+...+\sum x_{i1}x_{ip}w_{p} \\ ...\\ \sum x_{ip}y_{i} = \sum x_{ip}w_{0}+\sum x_{ip}x_{i1}w_{1}+...+\sum x_{ip}^{2}w_{p} & \end{array} \right. yi=nw0+xi1w1+...+xipwpxi1yi=xi1w0+xi12w1+...+xi1xipwp...xipyi=xipw0+xipxi1w1+...+xip2wp
矩阵形式:
X ′ X W = X ′ Y X'XW=X'Y XXW=XY
W = ( X ′ X ) − 1 X ′ Y W = (X'X)^{-1}X'Y W=(XX)1XY
这是一个通用的形式,管它几元都行。写成这样的形式,用numpy的mat计算就更方便了,代码就更简单了(前段时间的网易笔试题就让编多元最小二乘,哎,自己推半天,还错了,哈哈),数学真的太重要了!!!

(也可按照上面一元的去自己推,不过太麻烦了,三元的我就在草稿纸上写了好多。。。)

参考:1.百度百科

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python中的最小二乘法线性拟合是一种统计分析方,用于通过拟合一个线性模型来估计数据集中的关系。这种方适用于当我们有一组自变量和对应的因变量时,想要找到一个最佳拟合线来描述两者之间的关系。 最小二乘法线性拟合的目标是找到一条直线,使得所有数据点到该直线的垂直距离之和最小。而这条直线可以用方程y = mx + b表示,其中m是斜率,b是y轴截距。 在Python中,可以通过使用Scipy库中的stats.linregress()函数来进行最小二乘法线性拟合。这个函数可以计算出相关系数、斜率、截距、标准误差等拟合结果。 下面是一个简单的示例,展示如何使用Python进行最小二乘法线性拟合: ```python import numpy as np from scipy import stats # 准备数据 x = np.array([1, 2, 3, 4, 5]) y = np.array([2, 3, 4, 5, 6]) # 进行最小二乘法线性拟合 slope, intercept, r_value, p_value, std_err = stats.linregress(x, y) # 打印拟合结果 print("斜率:", slope) print("截距:", intercept) print("相关系数:", r_value) print("p值:", p_value) print("标准误差:", std_err) ``` 这段代码中,我们首先准备了一组数据x和对应的因变量y。然后,使用stats.linregress()函数进行最小二乘法线性拟合,并将结果赋值给变量slope, intercept, r_value, p_value和std_err。最后,我们打印出了拟合结果。 最小二乘法线性拟合可用于数据分析、预测和回归问题。通过找到最佳拟合线,我们可以更好地理解数据的关系,并在之后的应用中进行预测和推断。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值