前言
已知x=(x ̂,f(x ̂))的N个观测值(x ̂1,f(x ̂1)),(x ̂2,f(x ̂2)),…,(x ̂N,f(x ̂N)),但不知(x ̂,f(x ̂)),这里f称为期望回归函数,试求(x ̂,f(x ̂)),这个问题为回归问题。
回归函数可以选择的表示很多。但是根据奥卡姆剃刀准则,应该选择简单而且又可行的回归函数。显然,如果可行,线性函数是最简单的回归函数。当回归函数F采用线性模型表示时,我们称这类模型为线性回归。
一元线性回归
一元线性方程有如下形式:
F
(
x
^
)
=
w
x
^
+
b
F(\hat{x})=w\hat{x}+b
F(x^)=wx^+b
其中,系数w,b∈R称为回归系数,根据类一致性准则,为了最小化D(f(X),F(X)),最常用的方法是采用最小二乘的形式,所以,一元线性回归函数的损失函数为:
D
(
f
(
X
)
,
F
(
X
)
)
=
L
(
w
,
b
)
=
1
N
∑
k
=
1
N
(
w
x
^
k
+
b
−
f
(
x
^
k
)
)
2
D(f(X),F(X))=L(w,b)=\frac{1}{N}\sum\limits_{k=1}^{N}{{{(w{{{\hat{x}}}_{k}}+b-f({{{\hat{x}}}_{k}}))}^{2}}}
D(f(X),F(X))=L(w,b)=N1k=1∑N(wx^k+b−f(x^k))2
此时,求解一元线性回归函数的问题转化为一个优化问题,即求解:
arg
min
w
,
b
 
L
(
w
,
b
)
=
arg
min
w
,
b
 
1
2
N
∑
k
=
1
N
(
w
x
^
k
+
b
−
f
(
x
^
k
)
)
2
\arg \underset{w,b}{\mathop{\min }}\,L(w,b)=\arg \underset{w,b}{\mathop{\min }}\,\frac{1}{2N}\sum\limits_{k=1}^{N}{{{(w{{{\hat{x}}}_{k}}+b-f({{{\hat{x}}}_{k}}))}^{2}}}
argw,bminL(w,b)=argw,bmin2N1k=1∑N(wx^k+b−f(x^k))2
为了最优化上述目标函数,对b和w求偏导,令导数为0,即:
∂
L
(
w
,
b
)
∂
b
=
0
,
∂
L
(
w
,
b
)
∂
w
=
0
\frac{\partial L(w,b)}{\partial b}=0,\frac{\partial L(w,b)}{\partial w}=0
∂b∂L(w,b)=0,∂w∂L(w,b)=0
可求得:
w
=
∑
k
=
1
N
x
^
k
f
(
x
^
k
)
−
N
x
ˉ
y
ˉ
∑
k
=
1
N
x
^
2
k
−
N
x
ˉ
2
w=\frac{\sum\limits_{k=1}^{N}{{{{\hat{x}}}_{k}}f({{{\hat{x}}}_{k}})-N\bar{x}\bar{y}}}{\sum\limits_{k=1}^{N}{{{{\hat{x}}}^{2}}_{k}-N{{{\bar{x}}}^{2}}}}
w=k=1∑Nx^2k−Nxˉ2k=1∑Nx^kf(x^k)−Nxˉyˉ
b
=
f
ˉ
−
w
x
ˉ
b=\bar{f}-w\bar{x}
b=fˉ−wxˉ
其中,
x
ˉ
=
∑
k
=
1
N
x
^
k
N
,
f
ˉ
=
∑
k
=
1
N
f
(
x
^
k
)
N
\bar{x}=\sum\limits_{k=1}^{N}{\frac{{{{\hat{x}}}_{k}}}{N},\bar{f}=\sum\limits_{k=1}^{N}{\frac{f({{{\hat{x}}}_{k}})}{N}}}
xˉ=k=1∑NNx^k,fˉ=k=1∑NNf(x^k)
案例
假设我们试图对某一社区中个人的受教育程度(用x表示)对年平均收入(用f(x)表示)的影响进行研究。我们从该社区中随机收集到11名个体的受教育年限(单位:年)和年平均收入(单位:千元)数据(见下表)。请利用该数据判断最佳线性回归模型。(精确到小数点后两位)
表 ——某小区11名个人的年平均收入与受教育年限
受教育年限x/年 | 6 | 10 | 9 | 9 | 16 | 12 | 16 | 5 | 10 | 12 | 8 |
---|---|---|---|---|---|---|---|---|---|---|---|
年平均收入f(x)/千元 | 5 | 7 | 6 | 6 | 9 | 18 | 13 | 5 | 10 | 12 | 10 |
解:因为已知数据只有一个输入特征,所以设回归函数为y=wx+b,利用上述公式计算w和b。
x
ˉ
=
(
6
+
10
+
9
+
9
+
16
+
12
+
16
+
5
+
10
+
12
+
8
)
/
11
=
10.27
\bar{x}=(6+10+9+9+16+12+16+5+10+12+8)/11=10.27
xˉ=(6+10+9+9+16+12+16+5+10+12+8)/11=10.27
f
ˉ
=
(
5
+
7
+
6
+
6
+
9
+
8
+
13
+
5
+
10
+
12
+
10
)
/
11
=
8.27
\bar{f}=(5+7+6+6+9+8+13+5+10+12+10)/11=8.27
fˉ=(5+7+6+6+9+8+13+5+10+12+10)/11=8.27
∑
k
=
1
11
x
^
k
f
(
x
^
k
)
=
6
×
5
+
10
×
7
+
.
.
.
+
8
×
10
=
1005
\sum\limits_{k=1}^{11}{{{{\hat{x}}}_{k}}f({{{\hat{x}}}_{k}})=6\times 5+10\times 7+...+8\times 10=1005}
k=1∑11x^kf(x^k)=6×5+10×7+...+8×10=1005
∑
k
=
1
11
x
^
2
k
=
6
2
+
10
2
+
.
.
.
+
8
2
=
1287
\sum\limits_{k=1}^{11}{{{{\hat{x}}}^{2}}_{k}={{6}^{2}}+{{10}^{2}}+...+{{8}^{2}}=1287}
k=1∑11x^2k=62+102+...+82=1287
所以,
w
=
∑
k
=
1
11
x
^
k
f
(
x
^
k
)
−
11
x
ˉ
f
ˉ
∑
k
=
1
11
x
^
2
k
−
11
x
ˉ
2
=
1005
−
11
×
10.27
×
8.27
1287
−
11
×
10.27
2
=
70.74
126.80
=
0.56
w=\frac{\sum\limits_{k=1}^{11}{{{{\hat{x}}}_{k}}f({{{\hat{x}}}_{k}})-11\bar{x}\bar{f}}}{\sum\limits_{k=1}^{11}{{{{\hat{x}}}^{2}}_{k}-11{{{\bar{x}}}^{2}}}}=\frac{1005-11\times 10.27\times 8.27}{1287-11\times {{10.27}^{2}}}=\frac{70.74}{126.80}=0.56
w=k=1∑11x^2k−11xˉ2k=1∑11x^kf(x^k)−11xˉfˉ=1287−11×10.2721005−11×10.27×8.27=126.8070.74=0.56
b
=
f
ˉ
−
w
x
ˉ
=
8.27
−
0.56
×
10.27
=
2.52
b=\bar{f}-w\bar{x}=8.27-0.56\times 10.27=2.52
b=fˉ−wxˉ=8.27−0.56×10.27=2.52
故所求的线性回归方程为:
F
(
x
^
)
=
0.56
x
^
+
2.52
F(\hat{x})=0.56\hat{x}+2.52
F(x^)=0.56x^+2.52
线性回归的推广
多项式回归
回到我们开始的线性模型,
h
θ
(
x
1
,
x
2
,
.
.
.
x
n
)
=
θ
0
+
θ
1
x
1
+
.
.
.
+
θ
n
x
n
h_\theta(x_1, x_2, ...x_n) = \theta_0 + \theta_{1}x_1 + ... + \theta_{n}x_{n}
hθ(x1,x2,...xn)=θ0+θ1x1+...+θnxn,如果这里不仅仅是x的一次方,比如增加二次方,那么模型就变成了多项式回归。这里写一个只有两个特征的p次方多项式回归的模型:
h
θ
(
x
1
,
x
2
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
θ
3
x
1
2
+
θ
4
x
2
2
+
θ
5
x
1
x
2
h_\theta(x_1, x_2) = \theta_0 + \theta_{1}x_1 + \theta_{2}x_{2} + \theta_{3}x_1^{2} + \theta_{4}x_2^{2} + \theta_{5}x_{1}x_2
hθ(x1,x2)=θ0+θ1x1+θ2x2+θ3x12+θ4x22+θ5x1x2
我们令
x
0
=
1
,
x
1
=
x
1
,
x
2
=
x
2
,
x
3
=
x
1
2
,
x
4
=
x
2
2
,
x
5
=
x
1
x
2
x_0 = 1, x_1 = x_1, x_2 = x_2, x_3 =x_1^{2}, x_4 = x_2^{2}, x_5 = x_{1}x_2
x0=1,x1=x1,x2=x2,x3=x12,x4=x22,x5=x1x2,,这样我们就得到了下式:
h
θ
(
x
1
,
x
2
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
θ
3
x
3
+
θ
4
x
4
+
θ
5
x
5
h_\theta(x_1, x_2) = \theta_0 + \theta_{1}x_1 + \theta_{2}x_{2} + \theta_{3}x_3 + \theta_{4}x_4 + \theta_{5}x_5
hθ(x1,x2)=θ0+θ1x1+θ2x2+θ3x3+θ4x4+θ5x5
可以发现,我们又重新回到了线性回归,这是一个五元线性回归,可以用线性回归的方法来完成算法。对于每个二元样本特征
(
x
1
,
x
2
)
(x_1,x_2)
(x1,x2),我们得到一个五元样本特征
(
1
,
x
1
,
x
2
,
x
1
2
,
x
2
2
,
x
1
x
2
)
(1, x_1, x_2, x_{1}^2, x_{2}^2, x_{1}x_2)
(1,x1,x2,x12,x22,x1x2),通过这个改进的五元样本特征,我们重新把不是线性回归的函数变回线性回归。
广义线性回归
在上一节的线性回归的推广中,我们对样本特征端做了推广,这里我们对于特征y做推广。比如我们的输出Y不满足和X的线性关系,但是lnY 和X满足线性关系,模型函数如下:
l
n
Y
=
X
θ
ln\mathbf{Y} = \mathbf{X\theta}
lnY=Xθ
这样对与每个样本的输入y,我们用 lny去对应, 从而仍然可以用线性回归的算法去处理这个问题。我们把 Iny一般化,假设这个函数是单调可微函数g(.),则一般化的广义线性回归形式是:
g
(
Y
)
=
X
θ
或
者
Y
=
g
−
1
(
X
θ
)
\mathbf{g}(\mathbf{Y}) = \mathbf{X\theta}或者\mathbf{Y} = \mathbf{g^{-1}}(\mathbf{X\theta})
g(Y)=Xθ或者Y=g−1(Xθ)
这个函数g(.)我们通常称为联系函数。
线性回归的正则化
为了防止模型的过拟合,我们在建立线性模型的时候经常需要加入正则化项。一般有L1正则化和L2正则化。
线性回归的L1正则化通常称为Lasso回归,它和一般线性回归的区别是在损失函数上增加了一个L1正则化的项,L1正则化的项有一个常数系数α来调节损失函数的均方差项和正则化项的权重,具体Lasso回归的损失函数表达式如下:
J
(
θ
)
=
1
2
(
X
θ
−
Y
)
T
(
X
θ
−
Y
)
+
α
∣
∣
θ
∣
∣
1
J(\mathbf\theta) = \frac{1}{2}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y}) + \alpha||\theta||_1
J(θ)=21(Xθ−Y)T(Xθ−Y)+α∣∣θ∣∣1
其中n为样本个数,α为常数系数,需要进行调优。
∣
∣
θ
∣
∣
1
||\theta||_1
∣∣θ∣∣1为L1范数。
Lasso回归可以使得一些特征的系数变小,甚至还是一些绝对值较小的系数直接变为0。增强模型的泛化能力。
线性回归的L2正则化通常称为Ridge回归,它和一般线性回归的区别是在损失函数上增加了一个L2正则化的项,和Lasso回归的区别是Ridge回归的正则化项是L2范数,而Lasso回归的正则化项是L1范数。具体Ridge回归的损失函数表达式如下:
J
(
θ
)
=
1
2
(
X
θ
−
Y
)
T
(
X
θ
−
Y
)
+
1
2
α
∣
∣
θ
∣
∣
2
2
J(\mathbf\theta) = \frac{1}{2}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y}) + \frac{1}{2}\alpha||\theta||_2^2
J(θ)=21(Xθ−Y)T(Xθ−Y)+21α∣∣θ∣∣22
其中α为常数系数,需要进行调优。
∣
∣
θ
∣
∣
2
||θ||_2
∣∣θ∣∣2为L2范数。
Ridge回归在不抛弃任何一个特征的情况下,缩小了回归系数,使得模型相对而言比较的稳定,但和Lasso回归比,这会使得模型的特征留的特别多,模型解释性差。
除了上面这两种常见的线性回归正则化,还有一些其他的线性回归正则化算法,区别主要就在于正则化项的不同,和损失函数的优化方式不同,这里就不累述了。
线性回归的python代码实现
点击这里,下载数据集
python完整代码:
#-*- coding:utf-8 -*-
import numpy as np
from pylab import *
def train_wb(X, y):
"""
:param X:N*D的数据
:param y:X对应的y值
:return: 返回(w,b)的向量
"""
if np.linalg.det(X.T * X) != 0:
wb = ((X.T.dot(X).I).dot(X.T)).dot(y)
return wb
def test(x, wb):
return x.T.dot(wb)
def getdata():
x = []; y = []
file = open("ex0.txt", 'r')
for line in file.readlines():
temp = line.strip().split("\t")
x.append([float(temp[0]),float(temp[1])])
y.append(float(temp[2]))
return (np.mat(x), np.mat(y).T)
def draw(x, y, wb):
#画回归直线y = wx+b
a = np.linspace(0, np.max(x)) #横坐标的取值范围
b = wb[0] + a * wb[1]
plot(x, y, '.')
plot(a, b)
show()
X, y = getdata()
wb = train_wb(X, y)
draw(X[:, 1], y, wb.tolist())
运行结果如图所示:
参考
https://blog.csdn.net/u014028027/article/details/72667733
https://www.cnblogs.com/pinard/p/6004041.html