机器学习01:线性回归
线性回归的基本概念
线性模型的基本形式
给定由
n
n
n个属性描述的示例
x
=
(
x
1
;
x
2
;
.
.
.
;
x
n
)
\boldsymbol x=(x_1;x_2;...;x_n)
x=(x1;x2;...;xn),其中
x
i
x_i
xi是
x
\boldsymbol x
x在第
i
i
i个属性上的取值,线性模型试图学得一个通过属性的线性组合来进行预测的函数,即
h
(
x
)
=
w
1
x
1
+
w
2
x
2
+
.
.
.
+
w
n
x
n
+
b
h(\boldsymbol x) = w_1 x_1 + w_2 x_2 + ... + w_n x_n + b
h(x)=w1x1+w2x2+...+wnxn+b
定义权重向量
w
=
(
w
1
;
w
2
;
.
.
.
;
w
n
)
\boldsymbol w = (w_1; w_2; ... ; w_n)
w=(w1;w2;...;wn),表示每个属性在预测结果中所占的权重,上式可以写成
h
(
x
)
=
w
T
x
+
b
h(\boldsymbol x) = \boldsymbol w^T \boldsymbol x + b
h(x)=wTx+b
线性回归的最终目的,就是要求得权重向量 w \boldsymbol w w和截距 b b b.
![](https://i-blog.csdnimg.cn/blog_migrate/f75454903f8e8f92ef545510fe07fd6c.png)
线性模型的优点
线性回归(linear regreression)是机器学习里面最基本的模型,它主要的优点有如下两条:
- 线性模型形式简单,易于建模,但却蕴含着机器学习中的一些重要的基本思想,许多功能更为强大的非线性模型可在线性模型的基础上引入层级结构或高维映射得到.
- 线性模型具有很好的可解释性(
comprehensibility
),器权重向量可以直观表达各属性在预测中的重要性.
线性回归的损失函数
损失函数(又叫误差函数)反映了预测结果与实际结果之间的差别.对于线性回归模型,其损失函数为均方误差.
J
(
w
)
=
∑
i
=
1
m
(
h
(
x
i
)
−
y
i
)
2
=
∑
i
=
1
m
(
y
i
−
w
T
x
i
−
b
)
2
\begin{aligned} J(\boldsymbol w) &= \sum_{i=1}^m (h(\boldsymbol x_i) - \boldsymbol y_i)^2 \\ &= \sum_{i=1}^m (\boldsymbol y_i - \boldsymbol w^T \boldsymbol x_i -b)^2 \end{aligned}
J(w)=i=1∑m(h(xi)−yi)2=i=1∑m(yi−wTxi−b)2
下面是该损失函数的推导过程:
定义 ε i = f ( x i ) − y i \boldsymbol \varepsilon_i = f(\boldsymbol x_i) - \boldsymbol y_i εi=f(xi)−yi,表示预测值与实际值之间的误差.根据线性回归模型的基本假设, ε \varepsilon ε是独立同分布的,根据中心极限定理, ε \varepsilon ε应该服从均值为 0 0 0,方差为 σ 2 \sigma ^ 2 σ2的高斯分布.
将误差的定义式带入高斯分布的概率密度函数
p
(
ε
i
)
=
1
2
π
σ
exp
(
−
ε
i
2
2
σ
2
)
p(\boldsymbol \varepsilon_i) = \frac{1}{\sqrt{2 \pi} \sigma} \exp \left(-\frac{\varepsilon_i^2}{2 \sigma^2} \right)
p(εi)=2πσ1exp(−2σ2εi2)
即
p
(
y
i
∣
x
i
;
w
)
=
1
2
π
σ
exp
(
−
(
y
i
−
h
(
x
i
)
)
2
2
σ
2
)
p(\boldsymbol y_i | \boldsymbol x_i ; \boldsymbol w) = \frac{1}{\sqrt{2 \pi} \sigma} \exp \left( -\frac{(\boldsymbol y_i-h(\boldsymbol x_i))^2}{2 \sigma^2} \right)
p(yi∣xi;w)=2πσ1exp(−2σ2(yi−h(xi))2)
由于各个样本是独立的,它们的联合概率密度就是各自的概率密度的乘积,即似然函数
L
(
w
)
=
∏
i
=
1
m
p
(
y
i
∣
x
i
;
w
)
=
∏
i
=
1
m
1
2
π
σ
exp
(
−
(
y
i
−
w
T
x
i
)
2
2
σ
2
)
\begin{aligned} L(\boldsymbol w) &= \prod_{i=1}^m p(\boldsymbol y_i | \boldsymbol x_i ; \boldsymbol w) \\ &= \prod_{i=1}^m \frac{1}{\sqrt{2 \pi} \sigma} \exp \left( -\frac{\left(\boldsymbol y_i-\boldsymbol w^T \boldsymbol x_i \right)^2}{2 \sigma^2} \right) \end{aligned}
L(w)=i=1∏mp(yi∣xi;w)=i=1∏m2πσ1exp(−2σ2(yi−wTxi)2)
对上式取对数,得到
ℓ
(
w
)
=
log
L
(
w
)
=
log
∏
i
=
1
m
1
2
π
σ
exp
(
−
(
y
i
−
w
T
x
i
)
2
2
σ
2
)
=
∑
i
=
1
m
log
1
2
π
σ
exp
(
−
(
y
i
−
w
T
x
i
)
2
2
σ
2
)
=
m
log
1
2
π
σ
−
1
σ
2
⋅
1
2
∑
i
=
1
m
(
y
i
−
w
T
x
i
)
2
\begin{aligned} \ell (\boldsymbol w) &= \log L(\boldsymbol w) \\ &= \log \prod_{i=1}^m \frac{1}{\sqrt{2 \pi} \sigma} \exp \left( -\frac{(\boldsymbol y_i-\boldsymbol w^T \boldsymbol x_i)^2}{2 \sigma^2} \right) \\ &= \sum_{i=1}^m \log \frac{1}{\sqrt{2 \pi} \sigma} \exp \left( -\frac{(\boldsymbol y_i-\boldsymbol w^T \boldsymbol x_i)^2}{2 \sigma^2} \right) \\ &= m \log \frac{1}{\sqrt{2 \pi} \sigma} - \frac{1}{\sigma^2} \cdot \frac{1}{2} \sum_{i=1}^m \left(\boldsymbol y_i-\boldsymbol w^T \boldsymbol x_i \right)^2 \end{aligned}
ℓ(w)=logL(w)=logi=1∏m2πσ1exp(−2σ2(yi−wTxi)2)=i=1∑mlog2πσ1exp(−2σ2(yi−wTxi)2)=mlog2πσ1−σ21⋅21i=1∑m(yi−wTxi)2
要使得最大似然函数 L ( w ) L(\boldsymbol w) L(w)最大,就要使 J ( w ) = ∑ i = 1 m ( y i − w T x i ) 2 \displaystyle J(\boldsymbol w) = \sum_{i=1}^m (\boldsymbol y_i-\boldsymbol w^T \boldsymbol x_i )^2 J(w)=i=1∑m(yi−wTxi)2最小
线性回归的拟合方法
线性回归最常见的拟合方法有两种:最小二乘法(least square method)和梯度下降法(gradient descent).
最小二乘法
根据数学推导,权重矩阵
w
\boldsymbol w
w的最优解
w
=
(
X
T
X
)
−
1
X
T
y
\boldsymbol w = (\boldsymbol X^T \boldsymbol X)^{-1} \boldsymbol X^T \boldsymbol y
w=(XTX)−1XTy
最小二乘法的理论推导
为便于使用最小二乘法对
w
\boldsymbol w
w和
b
b
b进行估计,我们把
w
\boldsymbol w
w和
b
b
b纳入向量形式
w
^
=
(
w
;
b
)
\hat{\boldsymbol w} = (\boldsymbol w; b)
w^=(w;b),相应的,把数据集
D
D
D表示为一个
d
×
(
n
+
1
)
d \times (n+1)
d×(n+1)大小的矩阵
X
\boldsymbol X
X,其中每行对应一个示例前
n
n
n个元素对应于示例的
n
n
n个属性值,最后一个元素恒置为1,即
X
=
(
x
11
x
12
⋯
x
1
n
1
x
21
x
22
⋯
x
2
n
1
⋮
⋮
⋱
⋮
⋮
x
m
1
x
m
2
⋯
x
m
n
1
)
=
(
x
1
T
1
x
2
T
1
⋮
⋮
x
m
T
1
)
\boldsymbol X =\left( \begin{matrix} x_{11} & x_{12} & \cdots & x_{1n} &1 \\ x_{21} & x_{22} & \cdots & x_{2n} &1 \\ \vdots & \vdots & \ddots & \vdots &\vdots \\ x_{m1} & x_{m2} & \cdots\ & x_{mn} &1 \\ \end{matrix} \right) = \left( \begin{matrix} \boldsymbol x_1^T &1 \\ \boldsymbol x_2^T &1 \\ \vdots &\vdots \\ \boldsymbol x_m^T &1 \\ \end{matrix} \right)
X=⎝⎜⎜⎜⎛x11x21⋮xm1x12x22⋮xm2⋯⋯⋱⋯ x1nx2n⋮xmn11⋮1⎠⎟⎟⎟⎞=⎝⎜⎜⎜⎛x1Tx2T⋮xmT11⋮1⎠⎟⎟⎟⎞
再把标记也写成向量形式
y
=
(
y
1
;
y
2
;
.
.
.
;
y
m
)
\boldsymbol y = (y_1; y_2; ...; y_m)
y=(y1;y2;...;ym),将
J
(
w
^
)
J(\hat{\boldsymbol w})
J(w^)写成向量的形式,有
J
(
w
^
)
=
∑
i
=
1
m
(
h
(
x
i
)
−
y
i
)
2
=
(
X
w
^
−
y
)
T
(
X
w
^
−
y
)
\begin{aligned} J(\hat{\boldsymbol w}) &= \sum_{i=1}^m (h(\boldsymbol x_i) - \boldsymbol y_i)^2 \\ &= (\boldsymbol X \hat{\boldsymbol w} - \boldsymbol y)^T (\boldsymbol X \hat{\boldsymbol w} - \boldsymbol y) \end{aligned}
J(w^)=i=1∑m(h(xi)−yi)2=(Xw^−y)T(Xw^−y)
将
J
(
w
^
)
J(\hat{\boldsymbol w})
J(w^)对
w
^
\hat{\boldsymbol w}
w^求导
∂
J
(
w
^
)
∂
w
^
=
2
X
T
(
X
w
^
−
y
)
\begin{aligned} \frac {\partial J(\hat{\boldsymbol w})}{\partial \hat{\boldsymbol w}} &= 2 \boldsymbol X^T(\boldsymbol X \hat{\boldsymbol w} - \boldsymbol y) \end{aligned}
∂w^∂J(w^)=2XT(Xw^−y)
因为
J
(
w
^
)
J(\hat{\boldsymbol w})
J(w^)是一个凸函数,其最小值取值在拐点处.故令上式结果等于
0
0
0,得到
w
^
=
(
X
T
X
)
−
1
X
T
y
\hat{\boldsymbol w} = (\boldsymbol X^T \boldsymbol X)^{-1} \boldsymbol X^T \boldsymbol y
w^=(XTX)−1XTy
最小二乘法的代码实现
使用Python代码实现最小二乘法:
import numpy as np
# 创建X1,X2,Y为数据集,其中的点大致满足 Y=3*X1+2*X2+4 的规律
X1 = np.random.rand(100, 1)
X2 = np.random.rand(100, 1)
Y = 3 * X1 + 2 * X2 + 4 + np.random.randn(100, 1)
X_b = np.c_[X1, X2, np.ones((100, 1))] # 构建增广X矩阵
# 使用解析法求解omega
omega_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(Y)
print(omega_best)
计算得到 w ^ = [ 3.71349706 , 2.27034494 , 3.48867339 ] \hat{\boldsymbol w}=[3.71349706, 2.27034494, 3.48867339] w^=[3.71349706,2.27034494,3.48867339].
梯度下降法
梯度下降法的原理
梯度即函数下降速度最快的方向,梯度在各方向上的分量值为函数对该分量的导数.设二元函数
z
=
f
(
x
,
y
)
z = f(x, y)
z=f(x,y)在平面区域
D
D
D上具有一阶连续偏导数,则向量
{
∂
f
∂
x
,
∂
f
∂
y
}
=
f
x
(
x
,
y
)
⋅
i
+
f
y
(
x
,
y
)
⋅
j
\left \{ \frac{\partial f}{\partial x}, \frac{\partial f}{\partial y} \right \} = f_x(x, y) \cdot \boldsymbol i + f_y(x, y) \cdot \boldsymbol j
{∂x∂f,∂y∂f}=fx(x,y)⋅i+fy(x,y)⋅j为
f
(
x
,
y
)
f(x,y)
f(x,y)的梯度,记为
g
r
a
d
f
(
x
,
y
)
grad \, f(x, y)
gradf(x,y)或
∇
f
(
x
,
y
)
\nabla f(x, y)
∇f(x,y).即
g
r
a
d
f
(
x
,
y
)
=
∇
f
(
x
,
y
)
=
{
∂
f
∂
x
,
∂
f
∂
y
}
=
f
x
(
x
,
y
)
⋅
i
+
f
y
(
x
,
y
)
⋅
j
grad \, f(x, y) = \nabla f(x, y) = \left \{ \frac{\partial f}{\partial x}, \frac{\partial f}{\partial y} \right \} = f_x(x, y) \cdot \boldsymbol i + f_y(x, y) \cdot \boldsymbol j
gradf(x,y)=∇f(x,y)={∂x∂f,∂y∂f}=fx(x,y)⋅i+fy(x,y)⋅j
梯度下降法即通过对线性回归的损失函数 J ( w ) J(\boldsymbol w) J(w)求梯度,每次迭代都使 w ^ \hat{\boldsymbol w} w^沿着梯度方向下降,最终能找到函数的局部最小值;因为该损失函数是一个凸函数,我们找到的也就是损失函数的全局最小值.
梯度下降法的步骤如下:
- 初始化 w ^ 0 = ( w 1 ; w 2 ; . . . ; w n ) \hat{\boldsymbol w}_0 = (w_1; w_2; ... ; w_n) w^0=(w1;w2;...;wn)
- 计算当前 w ^ t \hat{\boldsymbol w}_t w^t处的梯度 ∇ J ( w ^ t ) = ( ∂ J ∂ w 1 , ∂ J ∂ w 2 , . . . , ∂ J ∂ w n ) \nabla J(\hat{\boldsymbol w}_t) = (\frac{\partial J}{\partial w_1}, \frac{\partial J}{\partial w_2}, ..., \frac{\partial J}{\partial w_n}) ∇J(w^t)=(∂w1∂J,∂w2∂J,...,∂wn∂J)
- 调整 w ^ t + 1 = w ^ t − α ⋅ ∇ J ( w ^ t \hat{\boldsymbol w}_{t+1} = \hat{\boldsymbol w}_{t} - \alpha \cdot \nabla J(\hat{\boldsymbol w}_t w^t+1=w^t−α⋅∇J(w^t,其中 α \alpha α为学习率,是一个超参数,它的选取可以影响迭代所需次数:若 α \alpha α过大,则会发生振荡,若 α \alpha α过小,则算法收敛过慢.
- 重复第2,3步直到梯度 ∇ J ( w ^ t ) \nabla J(\hat{\boldsymbol w}_t) ∇J(w^t)小于某阈值 ∇ m \nabla_m ∇m,该阈值 ∇ m \nabla_m ∇m也是一个超参数,同样会影响算法的收敛.
梯度下降法的代码实现
梯度下降法有三种常见实现: 分别为批量梯度下降算法,随机梯度下降算法和小批量梯度下降算法.它们的区别别在于迭代过程中计算梯度时所使用的样本条数不同.
批量梯度下降算法
批量梯度下降算法(batch gradient descent)在计算梯度时,先对每条样本均求取梯度,最后选取其平均值代入公式.即
w
^
t
+
1
=
w
^
t
−
1
m
α
X
T
(
X
w
t
^
−
y
)
\hat{\boldsymbol w}_{t+1} = \hat{\boldsymbol w}_{t} - \frac{1}{m} \alpha \boldsymbol X^T(\boldsymbol X \hat{\boldsymbol w_{t}} - \boldsymbol y)
w^t+1=w^t−m1αXT(Xwt^−y)
其优点为计算准确,更可能收敛到最优解,缺点为计算量较大.
import numpy as np
# 创建X1,X2,Y为数据集,其中的点大致满足 Y=3*X1+2*X2+4 的规律
m = 100 # 样本数
X1 = np.random.rand(m, 1)
X2 = np.random.rand(m, 1)
Y = 3 * X1 + 2 * X2 + 4
X_b = np.c_[X1, X2, np.ones((m, 1))] # 构建增广X矩阵
# 使用批量梯度下降算法求解omega
learning_rate = 0.1 # 定义学习率
iteration_num = 1000 # 定义迭代轮数
omega = np.random.randn(3, 1) # 初始化权重向量
for i in range(iteration_num): # 迭代
# 计算所有样本梯度的均值
gradient = 1 / m * X_b.T.dot(X_b.dot(omega) - Y)
omega = omega - learning_rate * gradient
print(omega)
可以看到,随着迭代轮数的增加,准确率升高.
随机梯度下降算法
随机梯度下降算法(stochastic gradient descent)在计算梯度时,随机取一个样本,对其计算梯度并代入公式.即
w
^
t
+
1
=
w
^
t
−
1
m
α
x
i
T
(
x
i
w
t
^
−
y
i
)
\hat{\boldsymbol w}_{t+1} = \hat{\boldsymbol w}_{t} - \frac{1}{m} \alpha \boldsymbol x_{i}^T(\boldsymbol x_{i} \hat{\boldsymbol w_{t}} - y_i)
w^t+1=w^t−m1αxiT(xiwt^−yi)
其优点为计算量小,且有时可以跳出局部最小值.
import numpy as np
# 创建X1,X2,Y为数据集,其中的点大致满足 Y=3*X1+2*X2+4 的规律
m = 100 # 样本数
X1 = np.random.rand(m, 1)
X2 = np.random.rand(m, 1)
Y = 3 * X1 + 2 * X2 + 4
X_b = np.c_[X1, X2, np.ones((m, 1))] # 构建增广X矩阵
# 使用随机梯度下降算法求解omega
learning_rate = 0.1 # 定义学习率
iteration_num = 1000 # 定义迭代轮数
omega = np.random.randn(3, 1) # 初始化权重向量
for i in range(iteration_num): # 迭代
# 选取随机一个样本计算梯度
random_index = np.random.randint(m)
x_i = X_b[random_index:random_index + 1]
y_i = Y[random_index:random_index + 1]
gradient = x_i.T * (x_i.dot(omega) - y_i)
omega = omega - learning_rate * gradient
print(omega)
下图直观展示了批量梯度下降算法和随机梯度下降算法的区别:(左为批量梯度下降算法,右为随机梯度下降算法)
小批量梯度下降算法
小批量梯度下降算法(mini-batch gradient descent)计算题梯时的策略介于批量梯度下降算法和随机梯度下降算法之间,选取样本中的一部分进行计算求取梯度.
过拟合
过拟合(overfitting)是指训练出的模型过于复杂,导致你和函数完美的符合训练集,但泛化能力较差,不能推广到新的数据集.
解决过拟合的办法:正则化
ℓ 1 \ell_1 ℓ1正则和 ℓ 2 \ell_2 ℓ2正则
在线性模型中,为了防止过拟合,我们希望所有属性的权重的绝对值 ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣越小越好,因此,我们使用权重构造惩罚项,加在损失函数中,可以有效防止过拟合现象.我们可以构造出两种惩罚项,分别为 ℓ 1 \ell_1 ℓ1正则( ℓ 1 \ell_1 ℓ1-norm)和 ℓ 2 \ell_2 ℓ2正则( ℓ 2 \ell_2 ℓ2-norm).
-
ℓ 1 \ell_1 ℓ1正则: 所有维度上的权重 w i w_i wi的绝对值之和.
∣ ∣ w ∣ ∣ 1 = 1 m ∑ i = 1 n w i ||w||_1 = \frac{1}{m} \sum_{i=1}^{n} w_i ∣∣w∣∣1=m1i=1∑nwi -
ℓ 2 \ell_2 ℓ2正则: 所有维度上的权重 w i w_i wi的平方之和.
∣ ∣ w ∣ ∣ 2 = 1 m ∑ i = 1 n w i 2 ||w||_2 = \frac{1}{m} \sum_{i=1}^{n} w_i^2 ∣∣w∣∣2=m1i=1∑nwi2
ℓ 1 \ell_1 ℓ1正则和 ℓ 2 \ell_2 ℓ2正则的作用
- 使用 ℓ 1 \ell_1 ℓ1正则,可以使得到权重向量 w \boldsymbol w w结果稀疏化,即有的 w i w_i wi接近于0,而有的 w i w_i wi接近于1.这可以用来降维.
- 使用 ℓ 2 \ell_2 ℓ2正则,可以使得权重向量 w \boldsymbol w w的结果整体偏小.
下面以两个维度的情况为例,说明两种正则为何起到不同的作用:
对于带有
ℓ
1
\ell_1
ℓ1和
ℓ
2
\ell_2
ℓ2正则的损失函数,等价于下面两种形式:
min
w
1
n
∣
∣
y
−
X
w
∣
∣
2
,
s
t
∣
∣
w
∣
∣
1
<
c
min
w
1
n
∣
∣
y
−
X
w
∣
∣
2
,
s
t
∣
∣
w
∣
∣
2
<
c
\min_w \frac{1}{n} ||y-Xw||^2, st||w||_1 \lt c \\ \min_w \frac{1}{n} ||y-Xw||^2, st||w||_2 \lt c
wminn1∣∣y−Xw∣∣2,st∣∣w∣∣1<cwminn1∣∣y−Xw∣∣2,st∣∣w∣∣2<c
我们将( w 1 w_1 w1, w 2 w_2 w2)的解空间画出,其中彩色的线是最小二乘表达式的等值线,黑色的线是正则约束的等值线,彩色线与黑色线相间的地方即为最优解.
因为 ℓ 1 \ell_1 ℓ1正则约束性项的等值线带有棱角,所以最优解很可能落在棱角上;而 ℓ 2 \ell_2 ℓ2正则正相反.
带有正则项的回归
通过在损失函数上加以不同的正则回归项,我们可以构造出三种回归模型: 岭回归(Ridge Regression,使用 ℓ 2 \ell_2 ℓ2正则项),Lasso回归(Lasso Regression,使用 ℓ 1 \ell_1 ℓ1正则项),Elastic-Net回归(Elastic-Net Regression,使用 ℓ 1 \ell_1 ℓ1和 ℓ 2 \ell_2 ℓ2正则项).
岭回归
岭回归的损失函数如下:
min
w
∣
∣
X
w
−
y
∣
∣
2
2
+
α
∣
∣
w
∣
∣
2
2
\min_w ||Xw-y||_2^2 + \alpha ||w||_2^2
wmin∣∣Xw−y∣∣22+α∣∣w∣∣22
使用sklearn求解岭回归的代码如下:
from sklearn import linear_model
reg = linear_model.Ridge(alpha=.5) # 设置超参数alpha:l2正则的权重
reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
# Ridge(alpha=0.5, copy_X=True, fit_intercept=True, max_iter=None,
# normalize=False, random_state=None, solver='auto', tol=0.001)
reg.coef_
# array([0.34545455, 0.34545455])
reg.intercept_
# 0.13636...
Lasso回归
Lasso回归的损失函数如下:
min
w
1
2
n
s
a
m
p
l
e
s
∣
∣
X
w
−
y
∣
∣
2
2
+
α
∣
∣
w
∣
∣
1
\min_w \frac{1}{2n_{samples}} ||Xw-y||_2^2 + \alpha ||w||_1
wmin2nsamples1∣∣Xw−y∣∣22+α∣∣w∣∣1
使用sklearn求解Lasso回归的代码如下:
from sklearn import linear_model
reg = linear_model.Lasso(alpha=0.1) # 设置超参数alpha:l1正则的权重
reg.fit([[0, 0], [1, 1]], [0, 1])
# Lasso(alpha=0.1, copy_X=True, fit_intercept=True, max_iter=1000,
# normalize=False, positive=False, precompute=False, random_state=None,
# selection='cyclic', tol=0.0001, warm_start=False)
reg.predict([[1, 1]])
# array([0.8])
Elastic-Net回归
Elastic-Net回归的损失函数如下:
min
w
1
2
n
s
a
m
p
l
e
s
∣
∣
X
w
−
y
∣
∣
2
2
+
α
ρ
∣
∣
w
∣
∣
1
+
α
(
1
−
ρ
)
2
∣
∣
w
∣
∣
2
2
\min_w \frac{1}{2n_{samples}} ||Xw-y||_2^2 + \alpha \rho ||w||_1 + \frac{\alpha(1- \rho)}{2} ||w||_2^2
wmin2nsamples1∣∣Xw−y∣∣22+αρ∣∣w∣∣1+2α(1−ρ)∣∣w∣∣22
多项式回归
可以通过升维,使用线性回归来求解多项式回归.
对于下述多项式:
y
^
(
w
,
x
)
=
w
0
+
w
1
x
1
+
w
2
x
2
+
w
3
x
1
x
2
+
w
4
x
1
2
+
w
5
x
2
2
\hat{y}(w, x) = w_0 + w_1 x_1 + w_2 x_2 + w_3 x_1x_2 + w_4 x_1^2 + w_5 x_2^2
y^(w,x)=w0+w1x1+w2x2+w3x1x2+w4x12+w5x22
我们可以将
x
x
x向量升维以构造
z
z
z向量
z
=
[
x
1
;
x
2
;
x
1
x
2
;
x
1
2
;
x
2
2
]
z = [x_1; x_2; x_1x_2; x_1^2; x_2^2]
z=[x1;x2;x1x2;x12;x22]
则
y
y
y与
z
z
z成线性关系,可以使用线性回归求解
y
^
(
w
,
x
)
=
w
0
+
w
1
z
1
+
w
2
z
2
+
w
3
z
3
+
w
4
z
4
+
w
5
z
5
\hat{y}(w, x) = w_0 + w_1 z_1 + w_2 z_2 + w_3 z_3 + w_4 z_4 + w_5 z_5
y^(w,x)=w0+w1z1+w2z2+w3z3+w4z4+w5z5
我们可以使用sklearn.preprocessing.PolynomialFeatures
类实现原始数据的升维,示例如下:
from sklearn.preprocessing import PolynomialFeatures
import numpy as np
X = np.arange(6).reshape(3, 2)
# array([[0, 1],
# [2, 3],
# [4, 5]])
poly = PolynomialFeatures(degree=2)
poly.fit_transform(X)
# array([[ 1., 0., 1., 0., 0., 1.],
# [ 1., 2., 3., 4., 6., 9.],
# [ 1., 4., 5., 16., 20., 25.]])
使用升维进行多项式回归的完整代码如下:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
# 构造数据集
X = 6 * np.random.rand(100, 1) - 3
y = 2 + X + 0.5 * X ** 2 + np.random.randn(100, 1)
plt.plot(X, y, 'b.')
degree_color = {1: 'g-', 2: 'r+', 10: 'y*'}
# 分别以degree=1,2,10进行多项式你和
for degree in degree_color.keys():
# 将样本数据升维
poly_features = PolynomialFeatures(degree=degree, include_bias=False) # 指定生成的高维数据不包含0次项
X_poly = poly_features.fit_transform(X)
# 对升维后的数据使用线性回归
lin_reg = LinearRegression(fit_intercept=True) # 指定拟合斜率
lin_reg.fit(X_poly, y)
print(lin_reg.intercept_, lin_reg.coef_)
# 输出并绘图
y_predict = lin_reg.predict(X_poly)
plt.plot(X, y_predict, degree_color[degree])
plt.legend(["degree=%d" % degree for degree in degree_color.keys()])
plt.show()
得到拟合结果如下:
degree=1:
intercept_=[3.35004007],coef_=[[0.84419104]]
degree=2:
intercept_=[1.98123375],coef_=[[1.00078942 0.5193602 ]]
degree=10:
intercept_=[1.83489589],coef_=[[ 1.36019108 0.26399949 -0.67077483 0.60043164 0.25872215 -0.25575867 -0.03607122 0.03928163 0.00170283 -0.00200932]]