回归是监督学习的一个重要问题,回归用于预测输入变量和输出变量之间的关系。回归模型是表示输入变量到输出变量之间映射的函数。回归问题的学习等价于函数拟合:使用一条函数曲线使其很好的拟合已知函数且很好的预测未知数据。回归问题按照输入变量的个数可以分为一元回归和多元回归;按照输入变量和输出变量之间关系的类型,可以分为线性回归和非线性回归。
再写一遍:一可以加深理解和记忆,二练习latex语法,三后面latex公式直接从这里套用。
latex符号大全
- 求和符号、上标、下标、左括号、右括号
- 分数、偏导符号
- 上横线
\overline{x}
, x ‾ \overline{x} x- 下划线
\underline{x}
, x ‾ \underline{x} x- 帽子
\hat{x}
, x ^ \hat{x} x^- 循环小数
\dot{x}
, x ˙ \dot{x} x˙
一、 最小二乘法-公式推导
一元回归
- 设拟合直线的方程式为: y = a + b x y=a+bx y=a+bx
$y=a+bx$
- 现有样本 ( 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_1,y_1),(x_2,y_2)...(x_n,y_n)$
- 设 d i d_i di为样本点到拟合线的距离,即误差: d i = y i − ( a + b x i ) d_i=y_i−(a+bx_i) di=yi−(a+bxi)
$d_i=y_i−(a+bx_i)$
- 设
D
D
D 为差方和(为什么要取平方 => 防止正负相互抵消)
D = ∑ i = 1 n d i 2 = ∑ i = 1 n ( y i − a − b x i ) 2 D = \sum_{i=1}^{n} d_{i}^{2} = \sum_{i=1}^{n}\left(y_{i}-a-bx_{i}\right)^{2} D=i=1∑ndi2=i=1∑n(yi−a−bxi)2
$$
D = \sum_{i=1}^{n} d_{i}^{2} = \sum_{i=1}^{n}\left(y_{i}-a-bx_{i}\right)^{2}
$$
- 我们要求 D D D最小,就是求 D D D的最小值。
- 最小值(一阶导数等于0,二阶大于等于0)
- 最大值(一阶导数等于0,二阶小于等于0)
- 因为 D D D为平方和,所以求一阶导数为0时,就满足 D D D最小
解答为什么求偏导
偏差平方和,恒大于等于0.同时可以知道,这玩意是不可能达到最大值的(只要足够偏离的话,那肯定是越来越大的),因此在偏导数为0时取到的是最小值咯~(取极值的条件嘛,偏导数为0)
对a求一阶偏导
∂
D
∂
a
=
∑
i
=
1
n
2
(
y
i
−
a
−
b
x
i
)
(
−
1
)
=
−
2
∑
i
=
1
n
(
y
i
−
a
−
b
x
i
)
=
−
2
(
∑
i
=
1
n
y
i
−
∑
i
=
1
n
a
−
b
∑
i
=
1
n
x
i
)
=
−
2
(
n
y
ˉ
−
n
a
−
n
b
x
ˉ
)
\begin{aligned} \frac{\partial D}{\partial a} &=\sum_{i=1}^{n} 2\left(y_{i}-a-b x_{i}\right)(-1) \\ &=-2 \sum_{i=1}^{n}\left(y_{i}-a-b x_{i}\right) \\ &=-2\left(\sum_{i=1}^{n} y_{i}-\sum_{i=1}^{n} a-b \sum_{i=1}^{n} x_{i}\right) \\ &=-2(n \bar{y}-n a-n b \bar{x}) \end{aligned}
∂a∂D=i=1∑n2(yi−a−bxi)(−1)=−2i=1∑n(yi−a−bxi)=−2(i=1∑nyi−i=1∑na−bi=1∑nxi)=−2(nyˉ−na−nbxˉ)
$$
\begin{aligned}
\frac{\partial D}{\partial a} &=\sum_{i=1}^{n} 2\left(y_{i}-a-b x_{i}\right)(-1) \\
&=-2 \sum_{i=1}^{n}\left(y_{i}-a-b x_{i}\right) \\
&=-2\left(\sum_{i=1}^{n} y_{i}-\sum_{i=1}^{n} a-b \sum_{i=1}^{n} x_{i}\right) \\
&=2(n \bar{y}-n a-n b \bar{x})
\end{aligned}
$$
对b求一阶偏导
∂
D
∂
b
=
∑
i
=
1
n
2
(
y
i
−
a
−
b
x
i
)
(
−
x
i
)
=
−
2
∑
i
=
1
n
(
x
i
y
i
−
a
x
i
−
b
x
i
2
)
=
−
2
(
∑
i
=
1
n
x
i
y
i
−
a
∑
i
=
1
n
x
i
−
b
∑
i
=
1
n
x
i
2
)
=
−
2
(
∑
i
=
1
n
x
i
y
i
−
a
n
x
‾
−
b
∑
i
=
1
n
x
i
2
)
\begin{aligned} \frac{\partial D}{\partial b} &=\sum_{i=1}^{n}2\left(y_i-a-bx_i\right)(-x_i)\\ &=-2\sum_{i=1}^{n}\left(x_iy_i-ax_i-bx_i^2\right)\\ &=-2\left(\sum_{i=1}^{n}x_iy_i-a\sum_{i=1}^{n}x_i-b\sum_{i=1}^{n}x_i^2\right)\\ &=-2\left(\sum_{i=1}^{n}x_iy_i-an\overline{x}-b\sum_{i=1}^{n}x_i^2\right) \end{aligned}
∂b∂D=i=1∑n2(yi−a−bxi)(−xi)=−2i=1∑n(xiyi−axi−bxi2)=−2(i=1∑nxiyi−ai=1∑nxi−bi=1∑nxi2)=−2(i=1∑nxiyi−anx−bi=1∑nxi2)
$$
\begin{aligned}
\frac{\partial D}{\partial b} &=\sum_{i=1}^{n}2\left(y_i-a-bx_i\right)(-x_i)\\
&=-2\sum_{i=1}^{n}\left(x_iy_i-ax_i-bx_i^2\right)\\
&=-2\left(\sum_{i=1}^{n}x_iy_i-a\sum_{i=1}^{n}x_i-b\sum_{i=1}^{n}x_i^2\right)\\
&=-2\left(\sum_{i=1}^{n}x_iy_i-an\overline{x}-b\sum_{i=1}^{n}x_i^2\right)
\end{aligned}
$$
- 令偏导等于 0
− 2 ( n y ‾ − n a − n b x ‾ ) = 0 -2(n\overline{y}-na-nb\overline{x})=0 −2(ny−na−nbx)=0 得:
=
>
=>
=>
a
=
y
‾
−
b
x
‾
(1)
a=\overline{y}-b\overline{x} \tag{1}
a=y−bx(1)
$$
a=\overline{y}-b\overline{x} \tag{1}
$$
− 2 ( ∑ i = 1 n x i y i − a n x ‾ − b ∑ i = 1 n x i 2 ) = 0 -2\left(\sum_{i=1}^{n}x_iy_i-an\overline{x}-b\sum_{i=1}^{n}x_i^2 \right) = 0 −2(i=1∑nxiyi−anx−bi=1∑nxi2)=0,将公式(1)代入得:
= > ∑ i = 1 n x i y i − n x ˉ y ˉ + n b x ˉ 2 − b ∑ i = 1 n x i 2 = 0 =>\sum_{i=1}^{n} x_{i} y_{i}-n \bar{x} \bar{y}+n b \bar{x}^{2}-b \sum_{i=1}^{n} x_{i}^{2}=0 =>i=1∑nxiyi−nxˉyˉ+nbxˉ2−bi=1∑nxi2=0
= > ∑ i = 1 n x i y i − n x ˉ y ˉ = b ( ∑ i = 1 n x i 2 − n x ˉ 2 ) =>\sum_{i=1}^{n} x_{i} y_{i}-n \bar{x} \bar{y}=b\left(\sum_{i=1}^{n} x_{i}^{2}-n \bar{x}^{2}\right) =>i=1∑nxiyi−nxˉyˉ=b(i=1∑nxi2−nxˉ2)
= > b = ∑ i = 1 n x i y i − n x ˉ y ˉ ∑ i = 1 n x i 2 − n x ˉ 2 (2) =>b=\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}} \tag{2} =>b=∑i=1nxi2−nxˉ2∑i=1nxiyi−nxˉyˉ(2)
$$
b=\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}} \tag{2}
$$
实在是,想偷个懒,还有这个斜杠删除线是怎么敲出来的
二、线性回归-公式推导
多元回归
1. 拟合平面
h
θ
(
x
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
h_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2
hθ(x)=θ0+θ1x1+θ2x2
h
θ
(
x
)
=
∑
i
=
0
n
θ
i
x
i
=
θ
T
x
h_\theta(x)=\sum_{i=0}^{n}\theta_ix_i=\theta^Tx
hθ(x)=∑i=0nθixi=θTx
θ 0 \theta_0 θ0是偏置项, x = ( x 0 , x 1 , x 2 . . . x n ) x=(x_0,x_1,x_2 ... x_n) x=(x0,x1,x2...xn),为了满足 θ 0 \theta_0 θ0起作用, x 0 = 1 x_0=1 x0=1(相当于1式中省略了)。
红色的点表示真实值, 垂线与平面交点为预测值,高度差代表误差
2. 误差分析
真实值与预测值之间一定存在误差(用 ε \varepsilon ε 来表示误差)
$\varepsilon$
对于每一个样本 y ( i ) = θ T x ( i ) + ε ( i ) y^{(i)}=\theta^Tx^{(i)}+\varepsilon^{(i)} y(i)=θTx(i)+ε(i):
- y ( i ) y^{(i)} y(i) 为真实值
- θ T \theta^T θT 为参数矩阵
- x ( i ) x^{(i)} x(i) 为第i条数据的属性矩阵
- ε ( i ) \varepsilon^{(i)} ε(i) 为第i条数据所产生的误差,服从均值为 0 0 0 方差为 θ 2 \theta^2 θ2 的高斯分布(正太分布)
$y^{(i)}=\theta^Tx^{(i)}+\varepsilon^{(i)}$
高斯分布: 在高斯分布中, 越靠近0的位置, 产生的偏差越小, 出现的概率就越大; 越远离0的位置, 产生的偏差越 大, 出现的概率就越小。(最大似然估计就是从此处的概率得出, 此处越接近0, 概率p越大)
3. 误差与高斯分布-公式代换
4. 似然函数与对数似然
似然函数: 似然函数是根据样本去估计参数的值的一个函数, 即是由数据去计算参数的大小为多大时, 参数和我们的数据组合后更接近真实值。(总而言之, 似然函数就是为了求解参数的函数)
对数似然: 对数似然相对于似然函数的有点在于运算方便。似然函数求取的方法是迭乘, 数字较大时会很不方便;对数似然求取的方法是迭加。(相比于似然函数而言, 对数似然较为实用)
5. 极大似然估计
极大似然估计: 极大似然估计即
L
(
θ
)
L(θ)
L(θ) 或 log
L
(
θ
)
L(θ)
L(θ) 越大越好, 那么下式越小越好,这就是最小二乘法的工作。
J
(
θ
)
=
1
2
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
J(\theta)=\frac{1}{2}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2
J(θ)=21i=1∑m(hθ(x(i))−y(i))2
矩阵转置公式:
- ( A T ) T = A (A^T)^T=A (AT)T=A
- ( A + B ) T = A T + B T (A+B)^T=A^T+B^T (A+B)T=AT+BT
- ( λ A ) T = λ A T (\lambda A)^T=\lambda A^T (λA)T=λAT
- ( A B ) T = B T A T (AB)^T=B^TA^T (AB)T=BTAT
- B T A T = ( A B ) T B^TA^T=(AB)^T BTAT=(AB)T
矩阵(向量)求导公式:
∂
A
x
⃗
∂
x
⃗
=
A
T
∂
A
x
⃗
∂
x
⃗
T
=
A
∂
(
x
⃗
T
A
)
∂
x
⃗
=
A
∂
y
∂
x
⃗
=
∂
(
x
⃗
T
A
x
⃗
)
∂
x
⃗
=
(
A
T
+
A
)
x
⃗
=
A
x
⃗
+
A
T
x
⃗
A
=
[
a
11
a
12
⋯
a
1
n
a
21
a
22
⋯
a
2
n
⋮
⋮
⋱
⋮
a
m
1
a
m
2
⋯
a
m
n
]
x
⃗
=
(
x
1
x
2
⋮
x
n
)
A
⋅
x
⃗
=
(
a
11
x
1
+
a
12
x
2
+
⋯
+
a
1
n
x
n
a
21
x
1
+
a
22
x
2
+
⋯
+
a
2
n
x
n
⋮
a
m
1
x
1
+
a
m
2
x
2
+
⋯
+
a
m
n
x
n
)
∂
y
⃗
∂
x
⃗
=
∂
A
x
⃗
∂
x
⃗
=
[
a
11
a
21
⋯
a
m
1
a
12
a
22
⋯
a
m
2
⋮
⋮
⋱
⋮
a
1
n
a
2
n
⋯
a
m
n
]
=
A
T
\begin{aligned} \frac{\partial A\vec{x}}{\partial \vec{x}}&=A^T\\ \\ \frac{\partial A\vec{x}}{\partial \vec{x}^T}&=A\\ \\ \frac{\partial (\vec{x}^T A)}{\partial \vec{x}}&=A\\ \\ \frac{\partial y}{\partial \vec{x}}=\frac{\partial(\vec{x}^TA\vec{x})}{\partial\vec{x}}&=(A^T+A)\vec{x}=A\vec x+A^T \vec x \end{aligned} \\ A=\left[\begin{array}{cccc} a_{11} & a_{12} & \cdots & a_{1 n} \\ a_{21} & a_{22} & \cdots & a_{2 n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m 1} & a_{m 2} & \cdots & a_{m n} \end{array}\right] \quad \vec{x}=\left(\begin{array}{c} x_{1} \\ x_{2} \\ \vdots \\ x_{n} \end{array}\right) \quad A \cdot \vec{x}=\left(\begin{array}{c} a_{11} x_{1}+a_{12} x_{2}+\cdots+a_{1 n} x_{n} \\ a_{21} x_{1}+a_{22} x_{2}+\cdots+a_{2 n} x_{n} \\ \vdots \\ \\ a_{m 1} x_{1}+a_{m 2} x_{2}+\cdots+a_{m n} x_{n} \end{array}\right)\\ \frac{\partial\vec{y}}{\partial\vec{x}}= \frac{\partial A\vec{x}}{\partial\vec{x}}= \left[\begin{array}{cccc} a_{11} & a_{21} & \cdots & a_{m1}\\ a_{12} & a_{22} & \cdots & a_{m2}\\ \vdots & \vdots & \ddots & \vdots\\ a_{1n} & a_{2n} & \cdots & a_{mn} \end{array}\right]= A^T
∂x∂Ax∂xT∂Ax∂x∂(xTA)∂x∂y=∂x∂(xTAx)=AT=A=A=(AT+A)x=Ax+ATxA=⎣⎢⎢⎢⎡a11a21⋮am1a12a22⋮am2⋯⋯⋱⋯a1na2n⋮amn⎦⎥⎥⎥⎤x=⎝⎜⎜⎜⎛x1x2⋮xn⎠⎟⎟⎟⎞A⋅x=⎝⎜⎜⎜⎜⎜⎛a11x1+a12x2+⋯+a1nxna21x1+a22x2+⋯+a2nxn⋮am1x1+am2x2+⋯+amnxn⎠⎟⎟⎟⎟⎟⎞∂x∂y=∂x∂Ax=⎣⎢⎢⎢⎡a11a12⋮a1na21a22⋮a2n⋯⋯⋱⋯am1am2⋮amn⎦⎥⎥⎥⎤=AT
\begin{aligned}
\frac{\partial A\vec{x}}{\partial \vec{x}}&=A^T\\
\\
\frac{\partial A\vec{x}}{\partial \vec{x}^T}&=A\\
\\
\frac{\partial (\vec{x}^T A)}{\partial \vec{x}}&=A\\
\\
\frac{\partial y}{\partial \vec{x}}=\frac{\partial(\vec{x}^T\cdot{A}\cdot\vec{x})}{\partial\vec{x}}&=(A^T+A)\cdot \vec{x}
\end{aligned}
\\
A=\left[\begin{array}{cccc}
a_{11} & a_{12} & \cdots & a_{1 n} \\
a_{21} & a_{22} & \cdots & a_{2 n} \\
\vdots & \vdots & \ddots & \vdots \\
a_{m 1} & a_{m 2} & \cdots & a_{m n}
\end{array}\right] \quad \vec{x}=\left(\begin{array}{c}
x_{1} \\
x_{2} \\
\vdots \\
x_{n}
\end{array}\right) \quad A \cdot \vec{x}=\left(\begin{array}{c}
a_{11} x_{1}+a_{12} x_{2}+\cdots+a_{1 n} x_{n} \\
a_{21} x_{1}+a_{22} x_{2}+\cdots+a_{2 n} x_{n} \\
\vdots \\
\\
a_{m 1} x_{1}+a_{m 2} x_{2}+\cdots+a_{m n} x_{n}
\end{array}\right)\\
\frac{\partial\vec{y}}{\partial\vec{x}}=
\frac{\partial A\vec{x}}{\partial\vec{x}}=
\left[\begin{array}{cccc}
a_{11} & a_{21} & \cdots & a_{m1}\\
a_{12} & a_{22} & \cdots & a_{m2}\\
\vdots & \vdots & \ddots & \vdots\\
a_{1n} & a_{2n} & \cdots & a_{mn}
\end{array}\right]=
A^T
latex 矩阵写法:
0
1
1
0
(
0
−
i
i
0
)
[
0
−
1
1
0
]
{
1
0
0
−
1
}
∣
a
b
c
d
∣
∥
i
0
0
−
i
∥
\begin{gathered} \begin{matrix} 0 & 1 \\ 1 & 0 \end{matrix} \quad \begin{pmatrix} 0 & -i \\ i & 0 \end{pmatrix} \quad \begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix} \quad \begin{Bmatrix} 1 & 0 \\ 0 & -1 \end{Bmatrix} \quad \begin{vmatrix} a & b \\ c & d \end{vmatrix} \quad \begin{Vmatrix} i & 0 \\ 0 & -i \end{Vmatrix} \end{gathered}
0110(0i−i0)[01−10]{100−1}∣∣∣∣acbd∣∣∣∣∥∥∥∥i00−i∥∥∥∥
$$
\begin{gathered}
\begin{matrix} 0 & 1 \\ 1 & 0 \end{matrix}
\quad
\begin{pmatrix} 0 & -i \\ i & 0 \end{pmatrix}
\quad
\begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix}
\quad
\begin{Bmatrix} 1 & 0 \\ 0 & -1 \end{Bmatrix}
\quad
\begin{vmatrix} a & b \\ c & d \end{vmatrix}
\quad
\begin{Vmatrix} i & 0 \\ 0 & -i \end{Vmatrix}
\end{gathered}
$$
矩阵式求解:
当我们的数据集含有m个样本,每个样本有n个特征时,数据x可以写成m*(n+1)维的矩阵(+1是添加一列1,用于与截断b相乘),θ则为n+1维的列向量(+1是截断b),y为m维的列向量代表每m个样本结果的预测值。则矩阵式的推导如下所示:
J
(
θ
)
=
1
2
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
=
1
2
(
X
θ
−
y
)
T
(
X
θ
−
y
)
=
1
2
(
θ
T
X
T
−
y
T
)
(
X
θ
−
y
)
=
1
2
(
θ
T
X
T
X
θ
−
θ
T
X
T
y
−
y
T
X
θ
+
y
T
y
)
求导:
∂
J
(
θ
)
∂
θ
=
1
2
(
2
X
T
X
θ
−
X
T
y
−
(
y
T
X
)
T
)
=
X
T
X
θ
−
X
T
y
偏导等于0:
θ
=
(
X
T
X
)
−
1
X
T
y
\begin{aligned} J(\theta)&=\frac{1}{2}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2\\ &=\frac{1}{2}(X\theta-y)^T(X\theta-y)\\ &=\frac{1}{2}(\theta^TX^T-y^T)(X\theta-y)\\ &=\frac{1}{2}(\theta^TX^TX\theta-\theta^TX^Ty-y^TX\theta+y^Ty)\\ \textbf{求导:}\\ \frac{\partial J(\theta)}{\partial\theta}&=\frac{1}{2}(2X^TX\theta-X^Ty-(y^TX)^T)\\ &=X^TX\theta-X^Ty\\ \textbf{偏导等于0:}\\ \theta&=(X^TX)^{-1}X^Ty \end{aligned}
J(θ)求导:∂θ∂J(θ)偏导等于0:θ=21i=1∑m(hθ(x(i))−y(i))2=21(Xθ−y)T(Xθ−y)=21(θTXT−yT)(Xθ−y)=21(θTXTXθ−θTXTy−yTXθ+yTy)=21(2XTXθ−XTy−(yTX)T)=XTXθ−XTy=(XTX)−1XTy
$$
\begin{aligned}
J(\theta)&=\frac{1}{2}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2\\
&=\frac{1}{2}(X\theta-y)^T(X\theta-y)\\
&=\frac{1}{2}(\theta^TX^T-y^T)(X\theta-y)\\
&=\frac{1}{2}(\theta^TX^TX\theta-\theta^TX^Ty-y^TX\theta+y^Ty)\\
\textbf{求导:}\\
\frac{\partial J(\theta)}{\partial\theta}&=\frac{1}{2}(2X^TX\theta-X^Ty-(y^TX)^T)\\
&=X^TX\theta-X^Ty\\
\textbf{偏导等于0:}\\
\theta&=(X^TX)^{-1}X^Ty
\end{aligned}
$$
6. 梯度下降算法
如果X的特征数 n n n 不是很大,通常情况下 X T X X^TX XTX是可以求逆的,但是如果 n n n 非常大, X T X X^TX XTX 不可逆,则用梯度下降法求解参数 θ θ θ。
在一元函数中叫做求导,在多元函数中就叫做求梯度。梯度下降是一个最优化算法,通俗的来讲也就是沿着梯度下降的方向来求出一个函数的极小值。比如一元函数中,加速度减少的方向,总会找到一个点使速度达到最小。通常情况下,数据不可能完全符合我们的要求,所以很难用矩阵去求解,所以机器学习就应该用学习的方法,因此我们采用梯度下降,不断迭代,沿着梯度下降的方向来移动,求出极小值。梯度下降法包括批量梯度下降法和随机梯度下降法(SGD)以及二者的结合mini批量下降法(通常与SGD认为是同一种,常用于深度学习中)
梯度下降一般过程
-
初始化 θ \theta θ (随机)
-
求 J ( θ ) J(\theta) J(θ) 对 θ \theta θ 的偏导
-
更新 θ \theta θ
其中α为学习率,沿着负梯度方向迭代,更新后的θ使得J(θ)更小。因为J(θ)是凸函数,所以GD求出的最优解是全局最优解。
批量梯度下降法 是求出整个数据集的梯度,再去更新θ,所以每次迭代都是在求全局最优解。
随机梯度下降法 是求一个样本的梯度后就去跟新θ,所以每次迭代都是求局部最优解,但是总是朝着全局最优解前进,最后总会到达全局最优解。
7. 使用正则项防止过拟合
在机器学习中,有时为了防止模型太复杂容易过拟合,通常会在模型上加入正则项,抑制模型复杂度,防止过拟合。在线性回归中有两种常用的正则,一个是L1正则,一个是L2正则。
一般L2的效果更好一些。L1能够产生稀疏模型,能够帮助我们去除某些特征,因此可以用于特征选择。
加入 L1正则 的称为 Lasso回归:
加入 L2正则 的成为 Ridge回归 也叫 岭回归:
三、代码实现
import numpy as np
class LinearRegression(object):
def __init__(self):
self.theta = [0]
self.loss = []
def fit(self,x_data,y_data,alpha=0.01,iters=1):
x_data = np.array(x_data)
y_data = np.array(y_data)
feat_n = x_data.shape[1] #特征数量
print(x_data)
print(x_data.shape)
x_data = np.insert(x_data,feat_n-1,1,axis=1) #插入一列1
self.theta = self.theta*(feat_n+1)
print(x_data)
print(x_data.shape)
#随机梯度下降
for i in range(iters):
for x,y in zip(x_data,y_data):
predict = self.__pre(x)
err = y-predict
self.theta = self.theta + np.multiply(alpha*err,x)
self.loss.append(self.cost(x[:-1].reshape(-1,feat_n),y))
def __pre(self,x):
return np.dot(x,self.theta)
def predict(self,x):
x = np.array(x)
x = np.insert(x,x.shape[1]-1,1,axis=1)
return self.__pre(x)
def cost(self,x,y):
return (1/2.0)*sum(np.power(self.predict(x)-y,2))
def get_weight(self):
return self.theta[:-1]
def get_loss(self):
return self.loss
def get_intercept(self):
return self.theta[-1]