梯度下降法求解线性回归

2024-08-29 03:44

本文主要是介绍梯度下降法求解线性回归,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 线性回归
    • 损失函数
      • 平均绝对误差(MAE)
      • 均方误差(MSE)
    • 最小二乘法
      • 最小二乘法代数推导
      • 最小二乘法矩阵推导
    • 线性回归 Python 实现
    • 线性回归 scikit-learn 实现
  • 梯度下降法
    • 梯度下降法的原理
  • 梯度下降法求解线性回归

线性回归

线性回归,就是已知一系列x和y对应的点,通过求出 y = w x + b y=wx+b y=wx+b(线性,所以是一条直线)去拟合数据点,预测某一个 x 0 x_0 x0对应的 y 0 y_0 y0是多少。

x = np.array([56, 72, 69, 88, 102, 86, 76, 79, 94, 74])
y = np.array([92, 102, 86, 110, 130, 99, 96, 102, 105, 92])

请添加图片描述
那么,如何求出这条直线?如何判断这条直线对数据的拟合程度好坏?
这里需要引入损失函数。

损失函数

平均绝对误差(MAE)

平均绝对误差(MAE)就是绝对误差的平均值,它的计算公式如下:
MAE ( y , y ^ ) = 1 n ∑ i = 1 n ∣ y i − y ^ i ∣ (1) \textrm{MAE}(y, \hat{y} ) = \frac{1}{n}\sum_{i=1}^{n}{|y_{i}-\hat y_{i}|}\tag{1} MAE(y,y^)=n1i=1nyiy^i(1)
其中, y i y_{i} yi 表示真实值, y ^ i \hat y_{i} y^i 表示预测值, n n n 则表示值的个数。MAE 的值越小,说明模型拥有更好的拟合程度。

def mae_value(y_true, y_pred):n = len(y_true)mae = sum(np.abs(y_true - y_pred))/nreturn mae

均方误差(MSE)

均方误差(MSE)表示误差的平方的期望值,它的计算公式如下:
MSE ( y , y ^ ) = 1 n ∑ i = 1 n ( y i − y i ^ ) 2 (2) \textrm{MSE}(y, \hat{y} ) = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y_i})^{2}\tag{2} MSE(y,y^)=n1i=1n(yiyi^)2(2)
其中, y i y_{i} yi 表示真实值, y ^ i \hat y_{i} y^i 表示预测值, n n n 则表示值的个数。MSE 的值越小,说明预测模型拥有更好的精确度。

def mse_value(y_true, y_pred):n = len(y_true)mse = sum(np.square(y_true - y_pred))/nreturn mse

在这里,我们已经知道了如何求损失,但是如何才能让损失最小呢?

最小二乘法

最小二乘法是用于求解线性回归拟合参数 w w w 的一种常用方法。最小二乘法中的「二乘」代表上面的均方误差(MSE),即均方误差最小。

最小二乘法代数推导

均方误差函数为:
y i ^ = w x i + b f = ∑ i = 1 n ( y i − ( w x i + b ) ) 2 (3) \hat{y_i}=wx_i+b\\ f = \sum\limits_{i = 1}^n {{{(y_{i}-(wx_{i}+b))}}^2} \tag{3} yi^=wxi+bf=i=1n(yi(wxi+b))2(3)
这里要求f的最小值,故求偏导如下:
∂ f ∂ b = ∂ ∑ i = 1 n ( y i 2 − 2 y i ( w x i + b ) + ( w x i + b ) 2 ) ∂ b = ∑ i = 1 n ( − 2 y i + 2 w x i + 2 b ) = − 2 ( ∑ i = 1 n y i − n b − w ∑ i = 1 n x i ) (4a) \frac{\partial f}{\partial b}=\frac{\partial \sum_{i=1}^n(y_i^2-2y_i(wx_i+b)+(wx_i+b)^2)}{\partial b} \\=\sum_{i=1}^n(-2y_i+2wx_i+2b) \\=-2(\sum_{i=1}^{n}{y_i}-nb-w\sum_{i=1}^{n}{x_i}) \tag{4a} bf=bi=1n(yi22yi(wxi+b)+(wxi+b)2)=i=1n(2yi+2wxi+2b)=2(i=1nyinbwi=1nxi)(4a)
∂ f ∂ w = ∂ ∑ i = 1 n ( y i 2 − 2 y i ( w x i + b ) + ( w x i + b ) 2 ) ∂ w = ∑ i = 1 n ( − 2 y i x i + 2 w x i 2 + 2 x i b ) = − 2 ( ∑ i = 1 n x i y i − b ∑ i = 1 n x i − w ∑ i = 1 n x i 2 ) (4b) \frac{\partial f}{\partial w}=\frac{\partial \sum_{i=1}^n(y_i^2-2y_i(wx_i+b)+(wx_i+b)^2)}{\partial w} \\= \sum_{i=1}^n(-2y_ix_i+2wx_i^2+2x_ib) \\=-2(\sum_{i=1}^{n}{x_iy_i}-b\sum_{i=1}^{n}{x_i}-w\sum_{i=1}^{n}{x_i}^2) \tag{4b} wf=wi=1n(yi22yi(wxi+b)+(wxi+b)2)=i=1n(2yixi+2wxi2+2xib)=2(i=1nxiyibi=1nxiwi=1nxi2)(4b)
∂ f ∂ b = 0 \frac{\partial f}{\partial b}=0 bf=0 以及 ∂ f ∂ w = 0 \frac{\partial f}{\partial w}=0 wf=0,解得:
w = n ∑ x i y i − ∑ x i ∑ y i n ∑ x i 2 − ( ∑ x i ) 2 (5b) w=\frac {n\sum_{}^{}{x_iy_i}-\sum_{}^{}{x_i}\sum_{}^{}{y_i}} {n\sum_{}^{}{x_i}^2-(\sum_{}^{}{x_i})^2} \tag{5b} w=nxi2(xi)2nxiyixiyi(5b)
b = ∑ x i 2 ∑ y i − ∑ x i ∑ x i y i n ∑ x i 2 − ( ∑ x i ) 2 (5b) b=\frac {\sum_{}^{}{x_i}^2\sum_{}^{}{y_i}-\sum_{}^{}{x_i}\sum_{}^{}{x_iy_i}} {n\sum_{}^{}{x_i}^2-(\sum_{}^{}{x_i})^2} \tag{5b} b=nxi2(xi)2xi2yixixiyi(5b)
已经求出了平方损失函数最小时对应的 w w w b b b 参数值,这也就是最佳拟合直线。

def w_calculator(x, y):n = len(x)w = (n*sum(x*y) - sum(x)*sum(y))/(n*sum(x*x) - sum(x)*sum(x))b = (sum(x*x)*sum(y) - sum(x)*sum(x*y))/(n*sum(x*x)-sum(x)*sum(x))return w,b
w_calculator(x,y)
# (0.7545842753077117, 41.33509168550616)

最小二乘法矩阵推导

一元线性函数的表达式为 y ( x , w ) = w 0 + w 1 x y(x, w) = w_0 + w_1x y(x,w)=w0+w1x(原式子里的w设为 w 1 w_1 w1,b设为 w 0 w_0 w0),表达成矩阵形式为:
[ 1 , x 1 1 , x 2 ⋯ 1 , x 9 1 , x 10 ] [ w 0 w 1 ] = [ y 1 y 2 ⋯ y 9 y 10 ] ⇒ [ 1 , 56 1 , 72 ⋯ 1 , 94 1 , 74 ] [ w 0 w 1 ] = [ 92 102 ⋯ 105 92 ] \left[ \begin{array}{c}{1, x_{1}} \\ {1, x_{2}} \\ {\cdots} \\ {1, x_{9}} \\ {1, x_{10}}\end{array}\right] \left[ \begin{array}{c}{w_{0}} \\ {w_{1}}\end{array}\right] = \left[ \begin{array}{c}{y_{1}} \\ {y_{2}} \\ {\cdots} \\ {y_{9}} \\ {y_{10}}\end{array}\right] \Rightarrow \left[ \begin{array}{c}{1,56} \\ {1,72} \\ {\cdots} \\ {1,94} \\ {1,74}\end{array}\right] \left[ \begin{array}{c}{w_{0}} \\ {w_{1}}\end{array}\right]=\left[ \begin{array}{c}{92} \\ {102} \\ {\cdots} \\ {105} \\ {92}\end{array}\right] 1,x11,x21,x91,x10 [w0w1]= y1y2y9y10 1,561,721,941,74 [w0w1]= 9210210592
y ( x , w ) = X W (6) y(x, w) = XW \tag{6} y(x,w)=XW(6)
( 6 ) (6) (6) 式中, W W W [ w 0 w 1 ] \begin{bmatrix}w_{0} \\ w_{1} \end{bmatrix} [w0w1],而 X X X 则是 [ X 1 , x ] [X_1,x] [X1,x] X 1 = [ 1 1 ⋯ 1 1 , ] X_1= \begin{bmatrix}1 \\ 1 \\ \cdots \\ 1 \\ 1, \end{bmatrix} X1= 1111, , x = [ x 1 x 2 ⋯ x 9 x 10 ] x= \begin{bmatrix}x_{1} \\ x_{2} \\ \cdots \\ x_{9} \\ x_{10} \end{bmatrix} x= x1x2x9x10 )矩阵。然后,平方损失函数为:

f = ∑ i = 1 n ( y i − ( w 0 + w 1 x i ) ) 2 = ( y − X W ) T ( y − X W ) (7) f = \sum\limits_{i = 1}^n {{{(y_{i}-(w_0 + w_1x_{i}))}}}^2 =(y-XW)^T(y-XW)\tag{7} f=i=1n(yi(w0+w1xi))2=(yXW)T(yXW)(7)
f = y T y − y T ( X W ) − ( X W ) T y + ( X W ) T ( X W ) (8) f = y^{T}y - y^{T}(XW) - (XW)^{T}y + (XW)^{T}(XW) \tag{8} f=yTyyT(XW)(XW)Ty+(XW)T(XW)(8)
在该公式中 y y y X W XW XW 皆为相同形式的 ( m , 1 ) (m,1) (m,1) 矩阵,由此两者相乘属于线性关系,所以等价转换如下:
f = y T y − ( X W ) T y − ( X W ) T y + ( X W ) T ( X W ) = y T y − 2 ( X W ) T y + ( X W ) T ( X W ) (9) f = y^{T}y - (XW)^{T}y - (XW)^{T}y + (XW)^{T}(XW)\\ = y^{T}y - 2 (XW)^{T}y + (XW)^{T}(XW) \tag{9} f=yTy(XW)Ty(XW)Ty+(XW)T(XW)=yTy2(XW)Ty+(XW)T(XW)(9)
W T 的偏导数是 W , T r ( A B ) 对 A 或 B 的偏导数是 B 或 A W^T的偏导数是W,Tr(AB)对A或B的偏导数是B或A WT的偏导数是WTr(AB)AB的偏导数是BA
对矩阵求偏导得:
∂ f ∂ W = 2 X T X W − 2 X T y = 0 (10) \frac{\partial f}{\partial W}=2X^TXW-2X^Ty=0 \tag{10} Wf=2XTXW2XTy=0(10)

当矩阵 X T X X^TX XTX 满秩时, ( X T X ) − 1 X T X = E (X^TX)^{-1}X^TX=E (XTX)1XTX=E,且 E W = W EW=W EW=W。所以有 ( X T X ) − 1 X T X W = ( X T X ) − 1 X T y (X^TX)^{-1}X^TXW=(X^TX)^{-1}X^Ty (XTX)1XTXW=(XTX)1XTy,并最终得到:
W = ( X T X ) − 1 X T y (11) W=(X^TX)^{-1}X^Ty \tag{11} W=(XTX)1XTy(11)

def w_matrix(x, y):w = (x.T * x).I * x.T * yreturn w
x= [[1, i] for i in x]
x = np.matrix(x)
y = np.matrix(y)w_matrix(x, y.reshape(-1, 1))
# matrix([[41.33509169],
#        [ 0.75458428]])

线性回归 Python 实现

以最小二乘法代数方法为例

w,b=w_calculator(x, y)
# 求损失
loss = mae_value(y,wx+b)

在上述例子中,得到的loss为447.69153479025357
接下来,我们尝试将拟合得到的直线绘制到原图中:

x_temp = np.linspace(50, 120, 100)  # 绘制直线生成的临时点plt.scatter(x, y)
plt.plot(x_temp, x_temp*w + b, 'r')

在这里插入图片描述
此时,想要预估x为100对应的y只需要代入公式 y = w x + b y=wx+b y=wx+b即可得到:116.79351921627732

线性回归 scikit-learn 实现

scikit-learn 把线性回归的过程整合到了LinearRegression() 类里,只需要填入需要的参数即可。

sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=1)
- fit_intercept: 默认为 True,计算截距项。
- normalize: 默认为 False,不针对数据进行标准化处理。
- copy_X: 默认为 True,即使用数据的副本进行操作,防止影响原数据。
- n_jobs: 计算时的作业数量。默认为 1,若为 -1 则使用全部 CPU 参与运算。

from sklearn.linear_model import LinearRegression

# 定义线性回归模型
model = LinearRegression()
model.fit(x.reshape(len(x), 1), y)  # 训练, reshape 操作把数据处理成 fit 能接受的形状# 得到模型拟合参数
model.intercept_, model.coef_

得到的结果(41.33509168550615, array([0.75458428]))和上述python得到结果一致。

# 想要预测x=100对应的y
model.predict([[100]])

梯度下降法

为了求解 w w w的极小值还可以引入一种叫「梯度下降」的求解方法。梯度下降法是一种十分常用且经典的最优化算法,通过这种方法我们就能快速找到函数的最小值。

梯度下降法的原理

什么是「梯度」?梯度是一个向量,它表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。对于一元函数而言,梯度就是指在某一点的导数。而对于多元函数而言,梯度就是指在某一点的偏导数组成的向量。

函数在沿梯度方向变化最快,所以「梯度下降法」的核心就是,我们沿着梯度下降方向去寻找损失函数的极小值(梯度的反方向)。过程如下图所示。

请添加图片描述
这里的损失函数依然是均方误差MSE:
J = f n = 1 n ∑ i = 1 n ( y i − y i ^ ) 2 (1) J= \frac fn= \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y_i})^{2}\tag{1} J=nf=n1i=1n(yiyi^)2(1)
J = 1 n ∑ i = 1 n ( y i − ( w x i + b ) ) 2 (2) J= \frac{1}{n} \sum_{i=1}^{n} (y_i -(wx_i+b))^{2}\tag{2} J=n1i=1n(yi(wxi+b))2(2)
求解参数和截距项对应的梯度:
∂ J ∂ w = − 2 n ∑ i = 1 n x i ( y i − ( w x i + b ) ) (3a) \frac{\partial J}{\partial w}= -\frac 2n \sum_{i=1}^{n} x_i(y_i -(wx_i+b))\tag{3a} wJ=n2i=1nxi(yi(wxi+b))(3a)

∂ J ∂ b = − 2 n ∑ i = 1 n ( y i − ( w x i + b ) ) (3b) \frac{\partial J}{\partial b}=-\frac 2n \sum_{i=1}^{n} (y_i -(wx_i+b))\tag{3b} bJ=n2i=1n(yi(wxi+b))(3b)
当我们得到梯度的方向,然后乘以一个常数 α \alpha α ,就可以得到每次梯度下降的步长(上图箭头的长度)。最后,通过多次迭代,找到梯度变化很小的点,也就对应着损失函数的极小值了。其中,常数 α \alpha α往往也被称之为学习率 Learning Rate。

在下文中用lr(Learning Rate)代表常数 α \alpha α

每次迭代,用w和b的初始值去减掉梯度*lr
w = w − ∂ J ∂ w ∗ l r (4a) w=w-\frac{\partial J}{\partial w}*lr\tag{4a} w=wwJlr(4a)
b = b − ∂ J ∂ b ∗ l r (4b) b=b-\frac{\partial J}{\partial b}*lr\tag{4b} b=bbJlr(4b)

梯度下降法求解线性回归

这里的x、y为数据点。

import numpy as np
import pandas as pd
def mse_value(y_true, y_pred):n = len(y_true)mse = sum(np.square(y_true - y_pred))/nreturn msedef gradient_w(X,y,z):# 梯度计算gradient = 2*np.dot(X.T, (z- y)) / y.shape[0]return gradientdef gradient_b(X,y,z):# 梯度计算one = np.ones(y.shape[0])gradient = 2*np.dot(one, (z- y)) / y.shape[0]return gradientdef gradient_descent():w = 0  # 初始参数为 0b = 0  # 初始参数为 0lr = 0.000000001 # 设置合理学习率num_iter = 300 # 设置合理迭代次数l_list = []  # 保存损失函数值for i in range(num_iter):  # 梯度下降迭代z=x*w+bw=w-gradient_w(x,y,z)*lrb=b-gradient_b(x,y,z)*lrl = mse_value(y,z)  # 计算损失函数值l_list.append(l)return w, b
#w, b,l_y=gradient_descent()

绘制损失函数如下,发现曲线在迭代次数为300时趋于平缓,得合理迭代次数为300
请添加图片描述

这篇关于梯度下降法求解线性回归的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

✨机器学习笔记(二)—— 线性回归、代价函数、梯度下降

1️⃣线性回归(linear regression) f w , b ( x ) = w x + b f_{w,b}(x) = wx + b fw,b​(x)=wx+b 🎈A linear regression model predicting house prices: 如图是机器学习通过监督学习运用线性回归模型来预测房价的例子,当房屋大小为1250 f e e t 2 feet^

【高等代数笔记】线性空间(一到四)

3. 线性空间 令 K n : = { ( a 1 , a 2 , . . . , a n ) ∣ a i ∈ K , i = 1 , 2 , . . . , n } \textbf{K}^{n}:=\{(a_{1},a_{2},...,a_{n})|a_{i}\in\textbf{K},i=1,2,...,n\} Kn:={(a1​,a2​,...,an​)∣ai​∈K,i=1,2,...,n

AI学习指南深度学习篇-带动量的随机梯度下降法的基本原理

AI学习指南深度学习篇——带动量的随机梯度下降法的基本原理 引言 在深度学习中,优化算法被广泛应用于训练神经网络模型。随机梯度下降法(SGD)是最常用的优化算法之一,但单独使用SGD在收敛速度和稳定性方面存在一些问题。为了应对这些挑战,动量法应运而生。本文将详细介绍动量法的原理,包括动量的概念、指数加权移动平均、参数更新等内容,最后通过实际示例展示动量如何帮助SGD在参数更新过程中平稳地前进。

用Python实现时间序列模型实战——Day 14: 向量自回归模型 (VAR) 与向量误差修正模型 (VECM)

一、学习内容 1. 向量自回归模型 (VAR) 的基本概念与应用 向量自回归模型 (VAR) 是多元时间序列分析中的一种模型,用于捕捉多个变量之间的相互依赖关系。与单变量自回归模型不同,VAR 模型将多个时间序列作为向量输入,同时对这些变量进行回归分析。 VAR 模型的一般形式为: 其中: ​ 是时间  的变量向量。 是常数向量。​ 是每个时间滞后的回归系数矩阵。​ 是误差项向量,假

AI学习指南深度学习篇-带动量的随机梯度下降法简介

AI学习指南深度学习篇 - 带动量的随机梯度下降法简介 引言 在深度学习的广阔领域中,优化算法扮演着至关重要的角色。它们不仅决定了模型训练的效率,还直接影响到模型的最终表现之一。随着神经网络模型的不断深化和复杂化,传统的优化算法在许多领域逐渐暴露出其不足之处。带动量的随机梯度下降法(Momentum SGD)应运而生,并被广泛应用于各类深度学习模型中。 在本篇文章中,我们将深入探讨带动量的随

2024 年高教社杯全国大学生数学建模竞赛题目——2024 年高教社杯全国大学生数学建模竞赛题目的求解

2024 年高教社杯全国大学生数学建模竞赛题目 (请先阅读“ 全国大学生数学建模竞赛论文格式规范 ”) 2024 年高教社杯全国大学生数学建模竞赛题目 随着城市化进程的加快、机动车的快速普及, 以及人们活动范围的不断扩大,城市道 路交通拥堵问题日渐严重,即使在一些非中心城市,道路交通拥堵问题也成为影响地方经 济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。 考虑一个拥有知名景区

带头结点的线性链表的基本操作

持续了好久,终于有了这篇博客,链表的操作需要借助图像模型进行反复学习,这里尽可能的整理并记录下自己的思考,以备后面复习,和大家分享。需要说明的是,我们从实际应用角度出发重新定义了线性表。 一. 定义 从上一篇文章可以看到,由于链表在空间的合理利用上和插入、删除时不需要移动等优点,因此在很多场合下,它是线性表的首选存储结构。然而,它也存在某些实现的缺点,如求线性表的长度时不如顺序存储结构的

浙大数据结构:02-线性结构4 Pop Sequence

这道题我们采用数组来模拟堆栈和队列。 简单说一下大致思路,我们用栈来存1234.....,队列来存输入的一组数据,栈与队列进行匹配,相同就pop 机翻 1、条件准备 stk是栈,que是队列。 tt指向的是栈中下标,front指向队头,rear指向队尾。 初始化栈顶为0,队头为0,队尾为-1 #include<iostream>using namespace std;#defi

深度学习与大模型第3课:线性回归模型的构建与训练

文章目录 使用Python实现线性回归:从基础到scikit-learn1. 环境准备2. 数据准备和可视化3. 使用numpy实现线性回归4. 使用模型进行预测5. 可视化预测结果6. 使用scikit-learn实现线性回归7. 梯度下降法8. 随机梯度下降和小批量梯度下降9. 比较不同的梯度下降方法总结 使用Python实现线性回归:从基础到scikit-learn 线性