线性回归LinearRegression

对视频中线性回归算法的相关内容进行总结与记录

一、理论基础

  • 回归
    通常是指利用某个函数,尽可能把数据样本点“串”在一起,用于描述输入变量和输出变量间的变化关系

  • 线性回归
    特点:用来把数据“串”起来的那个函数是线性的
    (一元线性回归(一个自变量) & 多元线性回归(至少两个自变量) )

一个线性函数的通式为 y = k ⋅ x + b y = k · x + b y=kx+b y = k T x + b y = k^T x + b y=kTx+b
其中:
x x x是nx1维的自变量向量, k k k是nx1维的权重。 y y y是输出变量, b b b是常数。
若为一元线性回归,则n为1

  • 线性回归的形式化定义
    通常用平方误差来衡量拟合的效果:
    真实值和预测值之差的平方,即: ( y ^ − y ) 2 (\hat{y} - y)^2 (y^y)2
    其中:
    y ^ \hat{y} y^代表真实值, y y y代表回归拟合的预测值

二、实例

2.1 一元线性回归

用一个线性函数去拟合购买率和折扣率(有7个样本点)

y y y表示购买率, x x x表示折扣率,那么线性函数的表达式就为 y = k x + b y = k x + b y=kx+b

假设已经有了 k k k b b b,那么就可以根据输入的x值,拟合出y的值。
线性回归的目标就是尽可能让“串”在一起的平方误差最小:
∑ i = 1 7 ( y i ^ − y i ) 2 \sum_{i=1}^{7}(\hat{y_{i}}-y_{i})^2 i=17(yi^yi)2

2.1.1 推导过程

令平方误差最小,本质即为求解最值的问题。

对线性回归而言,可以通过求导法来进行计算:

首先将平方误差函数用向量的形式进行表达:
∑ i = 1 7 ( y i ^ − y i ) 2 = ( y ^ − y ) T ( y ^ − y ) (1) \sum_{i=1}^{7}(\hat{y_{i}}-y_{i})^2 = (\hat{y}-y)^T(\hat{y}-y) \tag1 i=17(yi^yi)2=(y^y)T(y^y)(1)

且:
y i = k × x i + b × 1 = [ k b ] T [ x 1 ] = w T x (2) y_i = k\times x_i + b \times 1 = {\begin{bmatrix} k\\b \end{bmatrix}}^T {\begin{bmatrix} x\\1 \end{bmatrix}} = w^T x \tag2 yi=k×xi+b×1=[kb]T[x1]=wTx(2)

则7个样本合在一起的预测值的向量表示为: y = X w y = Xw y=Xw
其中, y y y为7×1的列向量, w w w为2×1的列向量, X X X为7×2的矩阵。

对式(1)进行化简:
L = ( y ^ − y ) T ( y ^ − y ) = ( y ^ − X w ) T ( y ^ − X w ) = ( y ^ T − w T X T ) ( y ^ − X w ) = y ^ T y ^ − y ^ T X w − w T X T y ^ + w T X T X w (3) \begin{aligned} L &= (\hat{y}-y)^T(\hat{y}-y)=(\hat{y}-Xw)^T(\hat{y}-Xw)\\ &= (\hat{y}^T-w^TX^T)(\hat{y}-Xw)\\ &= \hat{y}^T\hat{y} - \hat{y}^TXw - w^TX^T\hat{y} + w^TX^TXw \end{aligned} \tag3 L=(y^y)T(y^y)=(y^Xw)T(y^Xw)=(y^TwTXT)(y^Xw)=y^Ty^y^TXwwTXTy^+wTXTXw(3)

然后对式(3)利用求导法求得最小值:
∂ L ∂ w = 0 − X T y ^ − X T y ^ + 2 X T X w = 0 ⇒ − 2 X T y ^ + 2 X T X w = 0 ⇒ w = ( X T X ) − 1 X T y ^ (4) \begin{aligned} \frac{\partial L}{\partial w} &= 0 - X^T\hat{y} - X^T\hat{y} + 2X^TXw = 0\\ & \Rightarrow -2 X^T\hat{y} + 2X^TXw = 0\\ & \Rightarrow w = (X^TX)^{-1}X^T\hat{y} \end{aligned} \tag4 wL=0XTy^XTy^+2XTXw=02XTy^+2XTXw=0w=(XTX)1XTy^(4)

2.1.2 代码实现(基于numpy)

即通过 numpy 计算出 w = ( X T X ) − 1 X T y ^ w = (X^TX)^{-1}X^T\hat{y} w=(XTX)1XTy^ 即可

import numpy as np
# 设定x和yhat
x = np.array([[0.80,1],[0.85,1],[0.89,1],[0.87,1],[0.82,1],[0.74,1],[0.77,1]])
yhat = np.array([[0.25],[0.23],[0.18],[0.21],[0.23],[0.32],[0.29]])

xtx = np.dot(x.T,x)
# 计算xtx的逆
xtx_1 = np.linalg.inv(xtx)
w = xtx_1.dot(x.T).dot(yhat)

print('k:',str(w[0][0]))
print('-'*20)
print('b:',str(w[1][0]))

运行结果为:
在这里插入图片描述

2.1.3 代码实现(基于sklearn)

再通过sklearn去拟合这个函数。代码如下:

from sklearn.linear_model import LinearRegression
x = np.array([[0.80],[0.85],[0.89],[0.87],[0.82],[0.74],[0.77]])
yhat = np.array([[0.25],[0.23],[0.18],[0.21],[0.23],[0.32],[0.29]])
lr = LinearRegression()
lr.fit(x,yhat)
print('k:',lr.coef_)
print('-'*20)
print('b:',lr.intercept_)

运行结果如下:
在这里插入图片描述


2.2 多元线性回归

对上述问题进行拓展,若想研究折扣率 x 1 x_1 x1和好评率 x 2 x_2 x2共同影响购买率 y y y的关系,且想观察折扣率对购买率影响大还是好评率对购买率影响大

折扣率与好评率及购买率的值见下表:

日期折扣率 x 1 x_1 x1好评率 x 2 x_2 x2购买率 y y y
周一0.800.720.25
周二0.850.810.23
周三0.890.750.18
周四0.870.820.21
周五0.820.740.23
周六0.740.850.32
周日0.770.830.29

2.2.1 代码实现(基于numpy)

代码如图所示:

import numpy as np
# 设定x和yhat
x = np.array([[0.80,0.72,1],[0.85,0.81,1],[0.89,0.75,1],[0.87,0.82,1],[0.82,0.74,1],[0.74,0.85,1],[0.77,0.83,1]])
yhat = np.array([[0.25],[0.23],[0.18],[0.21],[0.23],[0.32],[0.29]])

xtx = np.dot(x.T,x)
# 计算xtx的逆
xtx_1 = np.linalg.inv(xtx)
w = xtx_1.dot(x.T).dot(yhat)

print('k1:',str(w[0][0]))
print('-'*20)
print('k2:',str(w[1][0]))
print('-'*20)
print('b:',str(w[2][0]))

运行结果如下:
在这里插入图片描述

2.2.2 代码实现(基于sklearn)

代码如图所示:

from sklearn.linear_model import LinearRegression
x = np.array([[0.80,0.72],[0.85,0.81],[0.89,0.75],[0.87,0.82],[0.82,0.74],[0.74,0.85],[0.77,0.83]])
yhat = np.array([[0.25],[0.23],[0.18],[0.21],[0.23],[0.32],[0.29]])
lr = LinearRegression()
lr.fit(x,yhat)
print('k1:',lr.coef_[0][0])
print('-'*20)
print('k2:',lr.coef_[0][1])
print('-'*20)
print('b:',lr.intercept_[0])

运行结果如下图:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值