线性模型(linear model)
基本形式:
f ( x ) = w T x + b f(x) = w^Tx+b f(x)=wTx+b
经典线性模型应用:
- 回归任务
- 二分类
- 多分类
线性回归
线性回归模型试图学得:
f
(
x
i
)
=
w
x
i
+
b
,
使
得
f
(
x
i
)
≈
y
f(x_i)=wx_i+b,使得f(x_i)\approx y
f(xi)=wxi+b,使得f(xi)≈y
性能度量(衡量学习效果):均方误差
(
w
∗
,
b
∗
)
=
a
r
g
m
i
n
∑
i
=
1
m
(
f
(
x
i
)
−
y
i
)
2
=
a
r
g
m
i
n
∑
i
=
1
m
(
y
i
−
w
x
i
−
b
)
2
(w^*,b^*) = arg min\sum_{i=1}^{m}(f(x_i)-y_i)^2\\ = arg min\sum_{i=1}^{m}(y_i-wx_i-b)^2\\
(w∗,b∗)=argmini=1∑m(f(xi)−yi)2=argmini=1∑m(yi−wxi−b)2
均方误差 是回归任务中最常用的性能度量。基于均方误差最小化来进行线性模型求解的方法称为"最小二乘法"。在线性回归中,最小二乘法就是试图找到一条直线,使得所有样本到直线上的欧式距离之和最小。求解 w w w 和 b b b 使得 E ( W , B ) = ∑ i = 1 m ( y i − w x i − b ) 2 E_{(W,B)}=\sum_{i=1}^{m}(y_i-wx_i-b)^2 E(W,B)=∑i=1m(yi−wxi−b)2 最小化的过程,称为线性回归模型的最小二乘"参数估计"。
E ( w , b ) E(w,b) E(w,b) 分别对 w w w 和 b b b 求导:
∂ E ( w , b ) ∂ w = 2 ( w ∑ i = 1 m x i 2 − ∑ i = 1 m ( y i − b ) x i ) , ∂ E ( w , b ) ∂ b = 2 ( m b − ∑ i = 1 m ( y i − w x i ) ) , \frac{\partial E(w,b)}{\partial w}=2(w\sum_{i=1}^{m}x_i^2-\sum_{i=1}^{m}(y_i-b)x_i),\\ \frac{\partial E(w,b)}{\partial b}=2(mb-\sum_{i=1}^{m}(y_i-wx_i)), ∂w∂E(w,b)=2(wi=1∑mxi2−i=1∑m(yi−b)xi),∂b∂E(w,b)=2(mb−i=1∑m(yi−wxi)),
令偏导为 0,可以得到最优解得闭式解:
w
=
∑
i
=
1
m
y
i
(
x
i
−
x
ˉ
)
∑
i
=
1
m
x
i
2
−
1
m
(
∑
i
=
1
m
x
i
)
2
b
=
1
m
∑
i
=
1
m
(
y
i
−
w
x
i
)
w = \frac{\sum_{i=1}^{m}y_i(x_i-\bar{x})}{\sum_{i=1}^{m}x_i^2-\frac{1}{m}(\sum_{i=1}^{m}x_i)^2}\\ b = \frac{1}{m}\sum_{i=1}^{m}(y_i-wx_i)
w=∑i=1mxi2−m1(∑i=1mxi)2∑i=1myi(xi−xˉ)b=m1i=1∑m(yi−wxi)
多元线性回归:
f
(
x
i
)
=
w
T
x
i
+
b
,
使
得
f
(
x
i
)
≈
y
i
f(x_i)=w^Tx_i+b,使得f(x_i)\approx y_i
f(xi)=wTxi+b,使得f(xi)≈yi
性能度量:
w
^
∗
=
a
r
g
m
i
n
(
y
−
X
w
^
)
T
(
y
−
X
w
^
)
\hat{w}^*=arg min(y-X\hat{w})^T(y-X\hat{w})
w^∗=argmin(y−Xw^)T(y−Xw^)
求偏导:
∂
E
w
^
w
^
=
2
X
T
(
X
w
^
−
y
)
\frac{\partial E_{\hat{w}}}{\hat{w}} = 2X^T(X\hat{w}-y)
w^∂Ew^=2XT(Xw^−y)
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import linear_model
from sklearn.metrics import r2_score, mean_squared_error
def setData(n):
# 线性模型实战
data = []
for i in range(n):
x1 = np.random.uniform(0., 10.) # 随机采样输入x
x2 = np.random.uniform(0., 10.) # 随机采样输入x
# 采样高斯噪声
eps = np.random.normal(0., 0.1)
# 得到模型的输出
y = 1.452 * x1 + 1.848 * x2 + 2.523 + eps
data.append([x1,x2,y])
data = np.array(data)
return data
n = 270
theta = 0.3
data = setData(n)
# fit_intercept=True 设置偏置
reg = linear_model.LinearRegression(fit_intercept=True)
reg.fit(data[:int(n*theta),0:2],data[:int(n*theta),-1])
print("w:{}\n b:{}".format(reg.coef_,[reg.intercept_]))
pre = reg.predict(data[int(n*theta):n,0:2])
print('Coefficient of determination: %.2f'%r2_score(data[int(n*theta):n,2], pre))
print('Mean squared error: %.2f'%mean_squared_error(data[int(n*theta):n,2], pre))
w:[1.45605848 1.86095833]
b:[2.4422744187779024]
Coefficient of determination: 1.00
Mean squared error: 0.01
# 绘图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(data[int(n*theta):n,0],data[int(n*theta):n,1],data[int(n*theta):n,2],c='b',marker='^')
ax.scatter(data[int(n*theta):n,0],data[int(n*theta):n,1],pre,c='r')
plt.figure()
plt.scatter(data[int(n*theta):n,0],data[int(n*theta):n,1],data[int(n*theta):n,2],alpha=0.2)
plt.scatter(data[int(n*theta):n,0],data[int(n*theta):n,1],pre,c='r',alpha=0.2)
# plt.show()
<matplotlib.collections.PathCollection at 0x1456ad835c0>
对数线性回归:
将输出标记的对数作为线性模型逼近的目标。
l n y = w T x + b lny=w^Tx+b lny=wTx+b
广义线性模型:
其中 g ( ⋅ ) g(·) g(⋅) 称为联系函数,显然,对数线性回归就是广义线性模型在 g ( ⋅ ) = l n ( ⋅ ) g(·)=ln(·) g(⋅)=ln(⋅) 时的特例.
y = g − 1 ( w T x + b ) y = g^{-1}(w^Tx+b) y=g−1(wTx+b)
对数几率回归(log-linear regression)
考虑二分类任务,其输出标记
y
∈
{
0
,
1
}
y\in\{0,1\}
y∈{0,1} ,将
z
=
w
T
x
+
b
z=w^Tx+b
z=wTx+b 映射到 0/1 值,最理想的是 单位阶跃函数(unit-step function
)
# 阶跃函数
def unit_step(x):
y = x>0
return y.astype(np.int)
x = np.linspace(-10,10,200)
y = unit_step(x)
plt.scatter(x,y,alpha=0.2,c='r')
plt.plot(x,y,c='b',alpha=0.8)
plt.xlabel('x')
plt.ylabel('y')
# plt.show()
Text(0,0.5,'y')
由于单位阶跃函数的不连续,我们通常选择近似单位阶跃函数并且单调可微的 对数几率函数(logistic function) 替代。
y
=
1
1
+
e
−
z
y = \frac{1}{1+e^{-z}}
y=1+e−z1
对数几率函数是一种 S i g m o i d Sigmoid Sigmoid 函数(形似 S S S 的函数)。
# 对数几率函数
def logistic(x):
y = 1/(1+np.exp(-x))
return y
x = np.linspace(-10,10,200)
y = logistic(x)
plt.scatter(x,y,alpha=0.2,c='r')
plt.plot(x,y,c='b',alpha=0.8)
plt.xlabel('x')
plt.ylabel('y')
# plt.show()
Text(0,0.5,'y')
将对数几率函数作为
g
−
(
⋅
)
g^-(·)
g−(⋅) 代入广义线性模型得到:
y
=
1
1
+
e
−
(
w
T
x
+
b
)
l
n
(
y
1
−
y
)
=
w
T
x
+
b
y = \frac{1}{1+e^{-(w^Tx+b)}}\\ ln(\frac{y}{1-y})=w^Tx+b
y=1+e−(wTx+b)1ln(1−yy)=wTx+b
y
1
−
y
\frac{y}{1-y}
1−yy 称为几率 (odds),反映了
x
x
x 作为正例的相对可能性,对几率取对数则可以得到对数几率(log odds / logit)
l
n
y
1
−
y
ln\frac{y}{1-y}
ln1−yy
···
线性判别分析
线性判别分析( L i n e a r D i s c r i m i n a n t A n a l y s i s Linear DiscriminantAnalysis LinearDiscriminantAnalysis,简称 L D A LDA LDA )是一种经典的线性学习方法。
L D A LDA LDA 的思想非常朴素:给定训练样例集,设法将样例投影到一条直线上,使得同类样例的投影点尽可能接近、异类样例的投影点尽可能远离;在对新样本进行分类时,将其投影到同样的这条直线上,再根据投影点的位置来确定新样本的类别。
多分类学习