对视频中线性回归算法的相关内容进行总结与记录
文章目录
一、理论基础
-
回归
通常是指利用某个函数,尽可能把数据样本点“串”在一起,用于描述输入变量和输出变量间的变化关系 -
线性回归
特点:用来把数据“串”起来的那个函数是线性的
(一元线性回归(一个自变量) & 多元线性回归(至少两个自变量) )
一个线性函数的通式为
y
=
k
⋅
x
+
b
y = k · x + b
y=k⋅x+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=1∑7(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=1∑7(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^T−wTXT)(y^−Xw)=y^Ty^−y^TXw−wTXTy^+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
∂w∂L=0−XTy^−XTy^+2XTXw=0⇒−2XTy^+2XTXw=0⇒w=(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.80 | 0.72 | 0.25 |
周二 | 0.85 | 0.81 | 0.23 |
周三 | 0.89 | 0.75 | 0.18 |
周四 | 0.87 | 0.82 | 0.21 |
周五 | 0.82 | 0.74 | 0.23 |
周六 | 0.74 | 0.85 | 0.32 |
周日 | 0.77 | 0.83 | 0.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])
运行结果如下图: