很多人想知道机器学习的那边是什么,其实机器学习的那边是数学。
生活中充满了各种预测,比如输入踩油门的力,输出车的速度。输入学习的时间,输出考试分数。输入硫和碳的函数,输出铁的硬度。
对一个样本,有 d d d 个属性, x = [ x 1 ; ⋯ ; x d ] x=[x_1; \cdots; x_d] x=[x1;⋯;xd],函数
f ( x ) = w 1 x 1 + ⋯ + w d x d + b f(x) = w_1 x_1 + \cdots + w_d x_d + b f(x)=w1x1+⋯+wdxd+b
写成向量形式
f ( x ) = w T x + b f(x) = w^T x + b f(x)=wTx+b
写成扩展形式
f ( x ) = w T x f(x) = w^T x f(x)=wTx
这里用同样记号,但实际上 w w w 和 x x x 都多增加了一行( w w w 和 x x x 均为列向量),下文中一律采样扩展形式。
补充: w w w 的权重分量绝对值越大,对应属性值对目标影响越大。
收集 m m m 个训练样本,第 i i i 个样本记为 x i ∈ R n + 1 x_i\in R^{n+1} xi∈Rn+1(样本为扩展形式,此处 x i x_i xi 代表一个样本,注意与上文区别),其观测值为 y i ∈ R y_i \in R yi∈R。数据矩阵为
X = [ − − x 1 T − − − − ⋮ − − − − x m T − − ] X = \left[\begin{matrix} -- & x_1^T & -- \\ -- & \vdots & -- \\ -- & x_m^T & -- \\ \end{matrix}\right] X=⎣⎢⎡−−−−−−x1T⋮xmT−−−−−−⎦⎥⎤
要求权重 w w w ,其实就是求解
X w = y (1) X w =y \tag{1} Xw=y(1)
方程 ( 1 ) (1) (1) 的解的个数有3种情况:
情形1:唯一解。通常是 X X X 为方阵。
情形2:无解。通常是 X X X 为细高型形矩阵。
情形3:无穷多解。通常是 X X X 为扁胖形矩阵。
对只有唯一解的情形1,可以直接矩阵求逆 w = X − 1 y w = X^{-1} y w=X−1y 获得权重。但更多遇到的是情形2和情形3. 对无解情况,通常采用最小二乘法。对无穷多解情况,通常采用岭回归和LASSO回归。下面分别叙述。
在无解的时候,寻找平方误差和最小的解当作最优解。最小二乘法衡量的平方误差:
∑ i = 1 m ( y i − x i T w ) 2 = ∥ y − X w ∥ 2 (2) \sum_{i=1}^m (y_i - x_i^T w)^2 = \Vert y - Xw\Vert ^2 \tag{2} i=1∑m(yi−xiTw)2=∥y−Xw∥2(2)
优化问题:
优化变量为 w w w,
m i n i m i z e ∥ y − X w ∥ 2 (3) {\rm minimize} \quad \Vert y - Xw\Vert ^2 \tag{3} minimize∥y−Xw∥2(3)
令 f ( w ) = ∥ y − X w ∥ 2 f(w) = \Vert y - Xw\Vert ^2 f(w)=∥y−Xw∥2,则最优解时
∇ f ( w ) = 2 X T ( X w − y ) = 0 (4) \nabla f(w) = 2X^T (Xw - y) = \boldsymbol 0 \tag{4} ∇f(w)=2XT(Xw−y)=0(4)
当 X T X X^T X XTX 满秩,则
w = ( X T X ) − 1 X T y (5) w = (X^T X)^{-1}X^T y \tag{5} w=(XTX)−1XTy(5)
建模:
当有无穷多解的时候,通常找系数和最小的解。优化问题:
m i n i m i z e ∥ w ∥ 2 2 s u b j e c t t o X w = y (6) \begin{aligned} {\rm minimize} &\quad \Vert w\Vert_2^2\\ {\rm subject\ to} &\quad Xw = y \end{aligned}\tag{6} minimizesubject to∥w∥22Xw=y(6)
通常会把这个问题转换成一个无约束问题,即
m i n i m i z e ∥ w ∥ 2 2 + γ ∥ X w − y ∥ 2 2 (7) {\rm minimize} \quad \Vert w\Vert_2^2 + \gamma\Vert Xw - y\Vert_2^2 \tag{7} minimize∥w∥22+γ∥Xw−y∥22(7)
其中 w w w 为优化变量, γ > 0 \gamma>0 γ>0 为常数,当 γ → + ∞ \gamma\rightarrow +\infty γ→+∞ 时,相当于 ( 6 ) (6) (6) 中的约束条件。此外,为了和最小二乘法类似,通常把式 ( 7 ) (7) (7) 改成如下的形式:
m i n i m i z e ∥ X w − y ∥ 2 2 + λ ∥ w ∥ 2 2 (8) {\rm minimize} \quad \Vert Xw - y\Vert_2^2 + \lambda \Vert w\Vert_2^2 \tag{8} minimize∥Xw−y∥22+λ∥w∥22(8)
其中 λ = 1 / γ > 0 \lambda = 1/\gamma > 0 λ=1/γ>0 。当 λ \lambda λ 比较小的时候,相当于 ( 6 ) (6) (6) 中约束,而当 λ \lambda λ 比较大时,会使 w w w 的模长尽可能小。
求解:
令 f ( w ) = ∥ y − X w ∥ 2 + λ ∥ w ∥ 2 f(w) = \Vert y - Xw\Vert ^2 +\lambda \Vert w\Vert ^2 f(w)=∥y−Xw∥2+λ∥w∥2,则最优解时
∇ f ( w ) = 2 ( X T ( X w − y ) + λ w ) = 0 \nabla f(w) = 2(X^T (Xw - y) + \lambda w)= \boldsymbol 0 ∇f(w)=2(XT(Xw−y)+λw)=0
解得
w = ( X T X + λ I ) − 1 X T y w = (X^T X + \lambda I)^{-1}X^T y w=(XTX+λI)−1XTy
这里 I I I 为单位矩阵, X T X + λ I X^T X + \lambda I XTX+λI 是一个半正定矩阵和一个正定矩阵的和,一定为正定矩阵,则可逆。
当问题 ( 6 ) (6) (6) 中的目标函数变成最小化 ∥ x ∥ 1 \Vert x\Vert_1 ∥x∥1 的时候,类似上面推导,问题转如下形式:
m i n i m i z e ∥ y − X w ∥ 2 2 + λ ∥ w ∥ 1 {\rm minimize} \quad \Vert y - Xw\Vert_2^2 + \lambda \Vert w\Vert_1\\ minimize∥y−Xw∥22+λ∥w∥1
其中 λ > 0 \lambda > 0 λ>0 ,优化变量为 w w w。
目标函数关于优化变量 w w w 并不处处可导,可以通过坐标轮换法进行求解。这里不作相关推导。
劣势:不可求导。
优势:可降维。
直接使用误差平方和评价,取值 [ 0 , + ∞ ) [0, +\infty) [0,+∞),值越小越好。
E r r = ∑ ( y t r u e − y p r e d ) 2 Err = \sum(y_{true} - y_{pred})^2 Err=∑(ytrue−ypred)2
使用下面相关系数平均,取值 ( − ∞ , 1 ] (-\infty,1] (−∞,1],值越大越好。
r = 1 − ∑ ( y t r u e − y p r e d ) 2 ∑ ( y t r u e − y t r u e − m e a n ) 2 r = 1- \frac{\sum (y_{true} - y_{pred})^2}{\sum (y_{true} - y_{true-mean})^2} r=1−∑(ytrue−ytrue−mean)2∑(ytrue−ypred)2
import numpy as np
import matplotlib.pyplot as plt
X = np.arange(5, 20)
y = 2 * X + np.random.randint(-5, 5, X.shape)
X = X.reshape(-1, 1)
X = np.c_[X, np.ones((len(X), 1))]
# 求解
w = np.linalg.inv(X.T @ X) @ X.T @ y
print(w)
# 绘图
yy = X @ w
plt.plot(X[:,0], yy)
plt.show()
数据集介绍:
import numpy as np
from sklearn.datasets import load_boston
X, y = load_boston(return_X_y=True)
X = np.c_[X, np.ones((len(X), 1))] # 增加偏置项
print(X.shape, y.shape)
# 求解
lamb = 1.
w1 = np.linalg.inv(X.T @ X) @ X.T @ y
w2 = np.linalg.inv(X.T @ X + lamb * np.eye(X.shape[1])) @ X.T @ y
# 计算平方误差和
lse1 = 1 - ((y - X@w1)**2).sum() / ((y - y.mean())**2).sum()
lse2 = 1 - ((y - X@w2)**2).sum() / ((y - y.mean())**2).sum()
print(np.abs(w1[:-1]).sum(), np.abs(w2[:-1]).sum())
# print(np.abs(y - X@w1).sum(), np.abs(y - X@w2).sum())
print(lse1, lse2)
class sklearn.linear_model.LinearRegression(*, fit_intercept=True, normalize=False, copy_X=True, n_jobs=None)
fit_intercept [bool, default=True]
拟合截距项normalize [bool, default=False]
是否规范化。在 fit_intercept=True
时无效。copy_X [bool, default=True]
是否拷贝数据,不拷贝可能改变原有数据coef_ [array of shape (n_features, ) or (n_targets, n_features)]
系数rank_ [int]
数据X
的秩intercept_ [float or array of shape (n_targets,)]
截距fit(X, y[, sample_weight])
predict(X)
score(X, y[, sample_weight])
返回 R 2 R^2 R2class sklearn.linear_model.Ridge(alpha=1.0, *, fit_intercept=True, normalize=False,copy_X=True, max_iter=None, tol=0.001, solver=’auto’,random_state=None)
solver [{‘auto’, ‘svd’, ‘cholesky’, ‘lsqr’, ‘sparse_cg’, ‘sag’, ‘saga’}, default=’auto’]
求解器class sklearn.linear_model.Lasso(alpha=1.0, *, fit_intercept=True, normalize=False, precompute=False, copy_X=True, max_iter=1000, tol=0.0001,warm_start=False, positive=False, random_state=None, selection=’cyclic’)
alpha [float, default=1.0]
L 1 L_1 L1 范数项的系数positive [bool, default=False]
当设为 True
时,迫使所有系数均为正数import numpy as np
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, Ridge, Lasso
X, y = load_boston(return_X_y=True)
print(X.shape, y.shape)
# 线性回归
lg = LinearRegression()
lg.fit(X, y)
# 岭回归
lamb = 1.
ridge = Ridge(alpha=lamb)
ridge.fit(X, y)
# 计算相关系数
lg_lse = lg.score(X, y)
ridge_lse = ridge.score(X, y)
print(np.abs(lg.coef_).sum(), np.abs(ridge.coef_).sum())
print(lg_lse, ridge_lse)
交流讨论QQ群:784117704
部分视频观看地址:b站搜索“火力教育”
课件下载地址:QQ群文件(有最新更新) or 百度网盘PDF课件及代码
链接:https://pan.baidu.com/s/1lc8c7yDc30KY1L_ehJAfDg
提取码:u3ls