基本形式
在聊基本形式之前,首先明确线性模型的目的:假设有一个实体
y
y
y,它的取值由许多东西决定,假设有d个属性
x
=
(
x
1
;
x
2
;
…
;
x
d
)
x = (x_1;x_2;\ldots;x_d)
x=(x1;x2;…;xd)可以决定
x
x
x的取值,(x是一个列向量),线性模型就是希望能够通过这d个属性的线性组合来预测
y
y
y的值,知晓了这个目的,线性模型的形式也就呼之欲出了:
f
(
x
)
=
ω
1
x
1
+
ω
2
x
2
+
…
+
w
d
x
d
+
b
f(x) = \omega_1x_1 + \omega_2x_2+\ldots + w_dx_d + b
f(x)=ω1x1+ω2x2+…+wdxd+b
这个式子里每个属性前都有一个因子与之相乘,可以将它们看作这个属性的重要程度
令
ω
=
(
ω
1
;
ω
2
;
…
;
ω
d
)
\omega = (\omega_1;\omega_2;\ldots;\omega_d)
ω=(ω1;ω2;…;ωd)(
ω
\omega
ω也是一个列向量),我们可以轻松地将
f
(
x
)
f(x)
f(x)改写为
f
(
x
)
=
ω
T
x
+
b
f(x) = \omega^Tx+b
f(x)=ωTx+b
一个最简单的线性模型的例子就是初中就学过的一次函数:
图示就是一个线性模型的例子,图上有三个点,假如我们就需要根据这三个点的横坐标去预测他们的纵坐标并做出了这条直线,从图可以看出我们的预测是完全正确的
一元线性回归
示意
但能完美的落在一条直线上的样本实在是太少了,在绝大多数情况下我们没有办法直接给出一条过所有样本点的直线,于是我们转而去寻找一条和样本点接近的直线,比如下图
虽然这条直线并没有经过样本中任何一个点,但与每一个点距离都很近,因此这条直线是对这整个样本最好的模拟,于是问题来了,我们该如何衡量直线与样本点的距离呢?
误差表示
在此,我们规定样本点
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi)与直线预测的点
(
x
i
,
f
(
x
i
)
)
(x_i,f(x_i))
(xi,f(xi))的距离为
(
f
(
x
i
)
−
y
i
)
2
(f(x_i) - y_i)^2
(f(xi)−yi)2,这个表达式被称为均方误差,它的好处在于样本点相对于直线的位置有上有下,通过平方项去估计总误差可以避免误差互相抵消,完成了定义,我们的目标就很明确了:
(
ω
∗
,
b
∗
)
=
a
r
g
m
i
n
(
ω
,
b
)
Σ
i
=
1
m
(
f
(
x
i
)
−
y
i
)
2
=
a
r
g
m
i
n
(
ω
,
b
)
Σ
i
=
1
m
(
f
(
x
i
)
−
ω
x
i
−
b
)
2
(\omega^*,b^*) = \underset{(\omega,b)}{argmin}\Sigma^m_{i=1}(f(x_i) - y_i)^2 \\ =\underset{(\omega,b)}{argmin}\Sigma^m_{i=1}(f(x_i) - \omega x_i - b)^2
(ω∗,b∗)=(ω,b)argminΣi=1m(f(xi)−yi)2=(ω,b)argminΣi=1m(f(xi)−ωxi−b)2
a
r
g
m
i
n
argmin
argmin表示使得后面表达式取最小值时参数的取值
参数求解
令
E
ω
,
b
=
Σ
i
=
1
m
(
f
(
x
i
)
−
ω
x
i
−
b
)
2
E_{{\omega,b}} = \Sigma^m_{i=1}(f(x_i) - \omega x_i - b)^2
Eω,b=Σi=1m(f(xi)−ωxi−b)2
对于参数的求解使用最小二乘法即可:
∂
E
(
ω
,
b
)
∂
ω
=
2
(
ω
Σ
i
=
1
m
x
i
2
−
Σ
i
=
1
m
(
y
i
−
b
)
x
i
)
\frac{\partial E_{(\omega,b)}}{\partial \omega} = 2(\omega \Sigma^m_{i=1}x_i^2 - \Sigma^m_{i=1}(y_i - b)x_i)
∂ω∂E(ω,b)=2(ωΣi=1mxi2−Σi=1m(yi−b)xi)
∂
E
(
ω
,
b
)
∂
b
=
2
(
m
b
−
Σ
i
=
1
m
(
y
i
−
ω
x
i
)
)
\frac{\partial E_{(\omega,b)}}{\partial b} = 2(mb - \Sigma^m_{i=1}(y_i - \omega x_i))
∂b∂E(ω,b)=2(mb−Σi=1m(yi−ωxi))
令这两项为0,即可得到
ω
=
Σ
i
=
1
m
y
i
(
x
i
−
x
ˉ
)
Σ
i
=
1
m
x
i
2
−
1
m
(
Σ
i
=
1
m
x
i
)
2
\omega = \frac{\Sigma^m_{i=1}y_i(x_i - \bar x)}{\Sigma^m_{i=1}x_i^2 - \frac{1}{m}(\Sigma^m_{i=1}x_i)^2}
ω=Σi=1mxi2−m1(Σi=1mxi)2Σi=1myi(xi−xˉ)
b
=
1
m
Σ
i
=
1
m
(
y
i
−
ω
x
i
)
b = \frac{1}{m}\Sigma^m_{i=1}(y_i - \omega x_i)
b=m1Σi=1m(yi−ωxi)
其中
x
ˉ
=
1
m
Σ
i
=
1
m
x
i
\bar x = \frac{1}{m}\Sigma^m_{i=1}x_i
xˉ=m1Σi=1mxi是
x
x
x的均值
代码
给出示意中直线的绘制代码
import numpy as np
import matplotlib.pyplot as plt
import random
x = np.arange(2, 5, 0.01)
def func_ran (x):
if type(x) != float and type(x) != int:
y = []
for t in x:
y_1 = 0.5*t + 1 + random.uniform(-0.2,0.2)
y.append(y_1)
return y
return 0.5 * x + 1 + random.uniform(-0.2,0.2)
def func (x,omega,b):
y = []
for t in x:
y.append(omega * t + b)
return y
x1 = [2.1,2.1,2.4,2.3,2.5,2.7,3.0,3.4,3.6,4.0,3.8,4.7,4.5,4.7,2.7]
avgx = sum(x1) / len(x1)
y1 = func_ran(x1)
matx = np.matrix(x1)
omega = ((np.matrix(y1)) * (matx - avgx).T).sum() / ((matx * matx.T).sum() - sum(x1)**2/len(x1))
omegax = omega * matx
b = ((y1 - omegax).sum())/len(x1)
y = func(x,omega.sum(),b)
plt.plot(x, y, label="y = {0:.3f}x + {1:.3f}".format(omega,b))
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.scatter(x1,y1,c = 'r')
plt.show()
多元线性回归
表示
为了进一步方便线性回归的向量表示,我们将
ω
\omega
ω,
b
b
b用一个矩阵来表示,向量形式写作
ω
^
=
(
ω
;
b
)
\hat \omega = (\omega;b)
ω^=(ω;b),
为了能够满足前述
f
(
x
)
=
ω
T
x
+
b
f(x) = \omega^Tx+b
f(x)=ωTx+b的形式,我们在
x
x
x的右侧增加一列,该列元素全一,并写作
请注意,
X
X
X并不是只有两列,它的列数与他的特征数有关
于是我们很容易得到
f
(
X
)
=
X
ω
^
f(X) = X\hat \omega
f(X)=Xω^,这是一个行向量,具体行数与样本数量有关
误差衡量与参数求解
仿照之前对误差的衡量,我们得到此时的误差衡量式:
(
y
−
X
ω
^
)
T
(
y
−
X
ω
^
)
(y - X\hat \omega)^T(y - X\hat \omega)
(y−Xω^)T(y−Xω^)行向量在转置后成为一个列向量,因此如此计算后会得到一个常数
我们的目标就变成了
ω
^
∗
=
a
r
g
m
i
n
ω
^
(
y
−
X
ω
^
)
T
(
y
−
X
ω
^
)
\hat \omega^*= \underset{\hat \omega}{argmin}(y - X\hat \omega)^T(y - X\hat \omega)
ω^∗=ω^argmin(y−Xω^)T(y−Xω^)
令
E
ω
^
=
(
y
−
X
ω
^
)
T
(
y
−
X
ω
^
)
E_{\hat \omega} = (y - X\hat \omega)^T(y - X\hat \omega)
Eω^=(y−Xω^)T(y−Xω^)
同样进行求导
∂
E
ω
^
∂
ω
^
=
2
X
T
(
X
ω
^
−
y
)
\frac {\partial E_{\hat \omega}}{\partial \hat \omega} = 2 X^T(X\hat \omega - y)
∂ω^∂Eω^=2XT(Xω^−y)
令其为0
得到
ω
^
∗
=
(
X
T
X
)
−
1
X
T
y
\hat \omega^* = (X^TX)^{-1}X^Ty
ω^∗=(XTX)−1XTy