基本形式
给定由d个属性描述的示例 x = ( x 1 ; x 2 ; . . . ; x d ) x = (x_1;x_2;...;x_d) x=(x1;x2;...;xd),其中 x i x_i xi是 x x x在第i个属性上的取值,线性模型试图学的一个通过属性的线性组合来进行预测的函数,即
f ( x ) = w 1 x 1 + w 2 x 2 + . . . + w d x d + b f(x) = w_1x_1 + w_2x_2 +...+w_dx_d+b f(x)=w1x1+w2x2+...+wdxd+b
一般用向量形式写成
f ( x ) = w T x + b f(x)=w^Tx+b f(x)=wTx+b
其中
w
=
(
w
1
;
w
2
;
.
.
;
w
d
)
w = (w_1;w_2;..;w_d)
w=(w1;w2;..;wd),
w
和
b
w和b
w和b学得之后,模型就得以确定。
线性回归
给定数据集 D = ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) D = {(x_1,y_1),(x_2,y_2),...,(x_m,y_m)} D=(x1,y1),(x2,y2),...,(xm,ym),其中 x i = ( x i 1 ; x i 2 ; . . . ; x i d ) , y i ∈ R x_i = (x_{i1};x_{i2};...;x_{id}),y_i \in R xi=(xi1;xi2;...;xid),yi∈R。“线性回归”试图学的一个线性模型以尽可能准确地预测实值输出标记。线性回归试图学得:
f ( x i ) = w x i + b , 使 得 f ( x i ) ≃ y i f(x_i) = wx_i + b, 使得f(x_i)\simeq y_i f(xi)=wxi+b,使得f(xi)≃yi
我们使用均方误差作为线性回归任务的性能度量来确定 w 和 b w和b w和b。
均方误差公式: E ( f ; D ) = 1 m ∑ i = 1 m ( f ( x i ) − y i ) 2 E(f;D) = \displaystyle\frac{1}{m}\sum_{i=1}^m(f(x_i)-y_i)^2 E(f;D)=m1i=1∑m(f(xi)−yi)2
我们试图让均方误差最小化,即
(
w
∗
,
b
∗
)
=
a
r
g
min
(
w
,
b
)
∑
i
=
1
m
(
f
(
x
i
)
−
y
i
)
2
(w^*, b^*) = \displaystyle{\underset {(w,b)}{\operatorname{arg\min}}\sum_{i=1}^m(f(x_i)-y_i)^2}
(w∗,b∗)=(w,b)argmini=1∑m(f(xi)−yi)2
=
a
r
g
min
(
w
,
b
)
∑
i
=
1
m
(
y
i
−
w
x
i
−
b
)
2
=\displaystyle{\underset {(w,b)}{\operatorname{arg\min}}\sum_{i=1}^m(y_i-wx_i-b)^2}
=(w,b)argmini=1∑m(yi−wxi−b)2
通过 “最小二乘法”即基于均方误差最小化来进行模型求解的方法。在线性回归中,最小二乘法试图找到一条直线,使所有样本到直线上的欧氏距离之和最小。即
E
(
w
,
b
)
=
∑
i
=
1
m
(
y
i
−
w
x
i
−
b
)
2
E_{(w,b)}=\displaystyle\sum_{i=1}^m(y_i-wx_i-b)^2
E(w,b)=i=1∑m(yi−wxi−b)2的最小过程。
我们将
E
(
w
,
b
)
E_{(w,b)}
E(w,b)分别对
w
和
b
w和b
w和b求导,使求导后式子为零,可以得到
w
和
b
w和b
w和b的最优解的闭式解得:
w = ∑ i = 1 m y i ( x i − x ˉ ) ∑ i = 1 m x i 2 − 1 m ( ∑ i = 1 m x i ) 2 w = \displaystyle\frac{\displaystyle\sum_{i=1}^my_i(x_i-\bar{x})}{\displaystyle\sum_{i=1}^mx_i^2-\frac{1}{m}(\sum_{i=1}^mx_i)^2} w=i=1∑mxi2−m1(i=1∑mxi)2i=1∑myi(xi−xˉ)
b
=
1
m
∑
i
=
1
m
(
y
i
−
w
x
i
)
b = \displaystyle\frac{1}{m}\sum_{i=1}^m(y_i-wx_i)
b=m1i=1∑m(yi−wxi)
其中 x ˉ = 1 m ∑ i = 1 m x i \bar{x} = \displaystyle\frac{1}{m}\sum_{i=1}^mx_i xˉ=m1i=1∑mxi为 x x x的均值。
多元线性回归:
更一般的情形,是以数据集 D D D,样本由 d d d个属性描述的,此时我们试图学得:
f ( x i ) = w T x i + b , 使 得 f ( x i ) ≃ y i f(x_i) = w^Tx_i+b,使得f(x_i)\simeq{y_i} f(xi)=wTxi+b,使得f(xi)≃yi
这称为 “多元线性回归”。
我们利用最小二乘法来对
w
和
b
w和b
w和b进行估计。便于讨论,将
w
和
b
w和b
w和b吸收入向量
w
^
=
(
w
;
b
)
\hat{w} = (w;b)
w^=(w;b),把数据集
D
D
D表示为一个
m
x
(
d
+
1
)
mx(d+1)
mx(d+1)大小的矩阵
X
X
X,其中每一行对应一个示例,改行前
d
d
d个元素对应于示例的
d
d
d个属性值,最后一个元素恒置为1,即
x
=
(
x
11
x
22
.
.
.
x
1
d
1
x
21
x
22
.
.
.
x
2
d
1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
x
m
1
x
m
2
.
.
.
x
m
d
1
)
=
(
x
1
T
1
x
2
T
1
.
.
.
.
.
.
x
m
T
1
)
x = \begin{pmatrix} x_{11} &x_{22}&...&x_{1d}&1 \\x_{21}&x_{22}&...&x_{2d}&1\\.&.&.&.&.\\ \\.&.&.&.&.\\\\.&.&.&.&.\\ x_{m1} &x_{m2}&...&x_{md}&1\end{pmatrix} = \begin{pmatrix}x_1^T & 1 \\ x_2^T & 1 \\ .&.\\.&.\\.&.\\x_m^T&1\end{pmatrix}
x=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎛x11x21...xm1x22x22...xm2............x1dx2d...xmd11...1⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎞=⎝⎜⎜⎜⎜⎜⎜⎛x1Tx2T...xmT11...1⎠⎟⎟⎟⎟⎟⎟⎞
再把标记也写成向量形式
y
=
(
y
1
;
y
2
;
.
.
.
;
y
m
)
y=(y_1;y_2;...;y_m)
y=(y1;y2;...;ym),则有:
w
^
∗
=
a
r
g
min
w
^
(
y
−
X
w
^
)
T
(
y
−
X
w
^
)
\hat{w}^* = \underset{\hat{w}}{\operatorname{arg\min}}(y-X\hat{w})^T(y-X\hat{w})
w^∗=w^argmin(y−Xw^)T(y−Xw^)
对 E w ^ = ( y − X w ^ ) T ( y − X ( ^ w ) ) E_{\hat{w}} = (y-X\hat{w})^T(y-X\hat(w)) Ew^=(y−Xw^)T(y−X(^w))求导以后,且另式子为零,可以得到 w ^ \hat{w} w^的最优解的闭式解。当 X T X X^TX XTX为满秩矩阵或正定矩阵时可以得通用解:
w ^ = ( X T X ) − 1 X T y \hat{w}=(X^TX)^{-1}X^Ty w^=(XTX)−1XTy
若令
x
i
^
=
(
x
i
;
1
)
\hat{x_i} = (x_i;1)
xi^=(xi;1)最终可以得到多元线性回归模型为:
f
(
x
i
^
)
=
x
i
^
T
(
X
T
X
)
−
1
X
T
y
f(\hat{x_{i}}) = \hat{x_{i}}^T(X^TX)^{-1}X^Ty
f(xi^)=xi^T(XTX)−1XTy
代码实现
通用公式实现:
def standRegress(xArr, yArr):
xMat = mat(xArr);
yMat = mat(yArr).T;
xTx = xMat.T*xMat
if linalg.det(xTx) == 0.0: #判定是否为正定矩阵
print('this matrix is singular, cannot do inverse')
return
ws = xTx.I * (xMat.T * yMat)
return ws
局部线性加权回归
线性回归的一个问题是有可能出现欠拟合现象,因为它求的是具有最小均方误差的
无偏估计。如果模型欠拟合将不能取得更好的预测效果。所以有些方法允许在估计中引入一些偏差,从而降低预测的均方误差。
局部线性加权回归(LWLR) 给带预测的点附近的每个点赋予一定的权重,在这个子集上基于最小均方差来进行普通的回归。形式如下:
w ^ = ( X T W X ) − 1 X T W y \hat{w} = (X^TWX)^{-1}X^TWy w^=(XTWX)−1XTWy
其中
W
W
W为一个矩阵,我们称之为 ‘核’,‘核’的类型可以自由选择,最常用的核是"高斯核",对应的权重如下:
w
(
i
,
i
)
=
e
x
p
⟮
∣
x
(
i
)
−
x
∣
−
2
k
2
⟯
w(i,i) = exp\lgroup\displaystyle\frac{|x^{(i)} - x|}{-2k^2}\rgroup
w(i,i)=exp⟮−2k2∣x(i)−x∣⟯
1.以上构建了一只含对角元素的权重矩阵
W
W
W,并且点
x
与
x
(
i
)
x与x(i)
x与x(i)越近,
w
(
i
,
i
)
w(i,i)
w(i,i)将会越大。
2.上述公式包含一个需要用户指定的参数k,它决定了对附近点赋予多大的权重。
代码实现
通用公式实现:
def lwlr(testPoint, xArr, yArr, k= 1.0):
xMat = mat(xArr);
yMat = mat(yArr).T;
m = shape(xMat)[0]
weights = mat(eye(m))
for j in range(m):
diffMat = testPoint - xMat[j, : ]
weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2))
xTx = xMat.T * (weights * xMat)
if linalg.det(xTx) == 0.0:
return
ws = xTx.I * (xMat.T * (weights * yMat))
return testPoint * ws
代码分析:
通过创建一个对角权重矩阵weights,阶数等于样本点个数,该矩阵为每个样本点初始化一个权重。算法将遍历数据集,计算每个样本点对应的权重值:随着样本点与待预测点距离的递增,权重以指数级衰减。
输入参数k控制衰减的速度。
代码测试获取k值反馈:
def lwlrTest(testArr, xArr, yArr, k = 1.0):
m = shape(testArr)[0]
yHat = zeros(m)
for i in range(m):
yHat[i] = lwlr(testArr[i], xArr, yArr, k)
return yHat
线性回归
优势: 结果易于理解,计算上不复杂
缺点: 对非线性的数据拟合不好
适用数据类型: 数值型和标称型