目录
线性回归模型概述优点和缺点基本形式 策略策略即是损失函数,代价函数,目标函数的具体定义如何从概率论的角度看损失函数 ?为什么需要目标函数 ?构造和优化目标函数经验风险(ER)与结构化风险(SR)J(f)可以是什么?优化目标函数 算法(只提供简单思路)最速下降法(梯度下降法)牛顿法修正(Modified)牛顿法拟(Quasi)牛顿法 最小二乘法 代码实战调包手冲最小二乘批量梯度下降随机梯度下降亿后还会完善的!
线性回归模型概述
优点和缺点
优点
1.形式简单,求解快,甚至有闭式解
2.可解释强
缺点
优点即缺点,对非线性函数拟合效果差
基本形式
数 据 集 : { ( x 1 , y 1 ) , ( ( x 2 , y 2 ) , . . . , ( ( x n , y n ) } , 其 中 ( x i = ( x 0 i ; x 1 i ; x 2 i ; . . . ; x d i ) , y i ∈ R 数据集:\{(\mathbf x_1,y_1),((\mathbf x_2,y_2),...,((\mathbf x_n,y_n)\},其中(\mathbf x_i = (x_0^{i};x_1^{i};x_2^{i};...;x_d^{i}),y_i\in R 数据集:{(x1,y1),((x2,y2),...,((xn,yn)},其中(xi=(x0i;x1i;x2i;...;xdi),yi∈R
f ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ d x d = ∑ i = 0 d θ i x i f(x) = \theta_0 + \theta_1x_1 + \theta_2x_2 + ... + \theta_dx_d = \sum_{i=0}^{d}\theta_ix_i \\ f(x)=θ0+θ1x1+θ2x2+...+θdxd=i=0∑dθixi
策略
策略即是损失函数,代价函数,目标函数的具体定义
1.Loss function: 度量单样本预测的错误程度,损失函数值越小,模型就越好。
2.Cost function: 度量全部样本集的平均误差。(常见的:均方误差(MSE),均方根误差(MSE),平均绝对误差等(MAE))
3.Objective function. 即是代价函数与正则化函数(罚项)的和,最终要优化的函数。
如何从概率论的角度看损失函数 ?
比较详细易懂:/p/fbd736a61927
为什么需要目标函数 ?
考虑以下一个例子:
设M次多项式(即模型):
f K ( x , w ) = w 0 + w 1 x + w 2 x 2 + ⋯ + w M x M = ∑ i = 0 M w i x i x , M ∈ R f_K(x,w)=w_0+w_1x+w_2x^2+ \cdots + w_Mx^M=\sum_{i=0}^{M}w_ix^i \quad x,M\in R fK(x,w)=w0+w1x+w2x2+⋯+wMxM=i=0∑Mwixix,M∈R
代价函数(策略)为:
J ( w ) = 1 2 ∑ i = 1 N ( f ( x i , w ) − y i ) 2 J(w)=\frac{1}{2}\sum_{i=1}^{N}(f(x_i,w)-y_i)^2 J(w)=21i=1∑N(f(xi,w)−yi)2
得到模型和策略后,我们就需要优化此代价函数,因此我们的问题也就变成最优化问题。接下来就交给算法了,这将在后文提及,这里先不做讨论。
易知,随着M的增大,那么多项式最高次变大,复杂度增大。观察下图:
摘自李航-统计学习方法
可以发现虽然随着模型复杂度的增大,对测试集的点拟合越来越好。但是我们也可以发现,数据的分布应该更符合 M=3时曲线。因此我们可以称M比较大时,模型过拟合(over-fitting)了,也可以说它的泛化能力(generation ability)差。相反,M比较小时,也不一定好,可称欠拟合(under-fitting)。
构造和优化目标函数
经验风险(ER)与结构化风险(SR)
1.经验风险即是平均损失(也可是代价函数):
R e m p ( f ) = 1 N ∑ i = 1 N L ( y i , f ( x i ) ) R_{emp}(f)=\frac{1}{N}\sum_{i=1}^{N}L(y_i,f(x_i)) Remp(f)=N1i=1∑NL(yi,f(xi))
2.结构化风险(即是上文提及的目标函数)
R s t r ( f ) = 1 N ∑ i = 1 N L ( y i , f ( x i ) ) + λ J ( f ) R_{str}(f)=\frac{1}{N}\sum_{i=1}^{N}L(y_i,f(x_i))+\lambda J(f) Rstr(f)=N1i=1∑NL(yi,f(xi))+λJ(f)
λ \lambda λ可以视为经验风险和模型复杂度的相对权重。而 J ( f ) J(f) J(f)则有模型的复杂度越高(对应上文的最高次数M),那么 J ( f ) J(f) J(f)值越大。
J(f)可以是什么?
J ( f ) J(f) J(f)即是正则项(regularizer)或叫罚项(penalty term)。这里介绍三种常见罚项:
1.Lasso(Least Absolute Shrinkage and Selection Operator)
J ( f ) = ∣ ∣ w ∣ ∣ 2 J(f)=\vert\vert w\vert\vert ^2 J(f)=∣∣w∣∣2
特点:更多的参数 w w w等于零
2.Ridge(Really Intense Dangerous Grapefruit Eating) Doge 😃
J ( f ) = ∣ ∣ w ∣ ∣ 1 J(f)=\vert\vert w\vert\vert _1 J(f)=∣∣w∣∣1
特点:更多的参数 w w w趋于零
3.Elastic-Net
J ( f ) = λ ∣ ∣ w ∣ ∣ 2 + ( 1 − λ ) ∣ ∣ w ∣ ∣ 1 , λ ∈ ( 0 , 1 ) J(f)=\lambda\vert\vert w\vert\vert ^2+(1-\lambda)\vert\vert w\vert\vert _1 , \lambda \in (0,1) J(f)=λ∣∣w∣∣2+(1−λ)∣∣w∣∣1,λ∈(0,1)
优化目标函数
经过上面的讨论,我们便可以通过最小化结构化风险函数(即是带罚项的经验风险函数)来达到优化的目的了。
即是说:
min f ∈ F 1 N ∑ i = 1 N L ( y i , f ( x i ) ) + λ J ( f ) \min_{f\in \mathcal{F}}\frac{1}{N}\sum_{i=1}^NL(y_i,f(x_i))+\lambda J(f) f∈FminN1i=1∑NL(yi,f(xi))+λJ(f)
其中 F \mathcal{F} F即是假设空间,也可以说是可能的模型。最小化方法,我们会在后文介绍到。
算法(只提供简单思路)
最速下降法(梯度下降法)
伪代码(Given objective: J ( θ ) J(\theta) J(θ), 步长(step size): α \alpha α, 最大迭代次数: N, 容忍值(tolerance): γ \gamma γ):
初始化参数 w w w
f o r k = 1 t o N : for\; k=1\; to\; N: fork=1toN:
g k = ∇ θ J ( θ ) \qquad g_k=\nabla _\theta J(\theta) gk=∇θJ(θ)
θ n e w = : θ o l d − α g k \qquad \theta_{new}=: \theta_{old} - \alpha g_k θnew=:θold−αgk
k = : k + 1 \qquad k=:k+1 k=:k+1
u n t i l ∣ ∣ ∇ θ J ( θ ) ∣ ∣ < = γ \qquad until\; \vert\vert\nabla_{\theta}J(\theta)\vert\vert <= \gamma until∣∣∇θJ(θ)∣∣<=γ
o r : or: or:
j u m p f i r s t l i n e \qquad jump\; first\; line jumpfirstline
优点:步骤简单,只需计算 ∇ θ J ( θ ) \nabla_\theta J(\theta) ∇θJ(θ)
缺点:收敛慢,“之”字形下降(zigzag)
zigzag现象
梯度下降法还可以分为,随机梯度下降和批量梯度下降。前者更适合大规模数据集。
牛顿法
伪代码(Given objective: J ( θ ) J(\theta) J(θ), 步长(step size): α \alpha α, 最大迭代次数: N, 容忍值(tolerance): γ \gamma γ):
初始化参数 w w w
f o r k = 1 t o N : for\; k=1\; to\; N: fork=1toN:
g k = [ ∇ θ 2 J ( θ ) ] − 1 ∇ θ J ( θ ) \qquad g_k=[\nabla _\theta^2 J(\theta)]^{-1}\nabla_\theta J(\theta) gk=[∇θ2J(θ)]−1∇θJ(θ)
θ n e w = : θ o l d − α g k \qquad \theta_{new}=: \theta_{old} - \alpha g_k θnew=:θold−αgk
k = : k + 1 \qquad k=:k+1 k=:k+1
u n t i l ∣ ∣ ∇ θ J ( θ ) ∣ ∣ < = γ \qquad until\; \vert\vert\nabla_{\theta}J(\theta)\vert\vert <= \gamma until∣∣∇θJ(θ)∣∣<=γ
o r : or: or:
j u m p f i r s t l i n e \qquad jump\; first\; line jumpfirstline
优点:用到了二阶导数的信息,收敛很快
缺点:优点即缺点,要计算海森(hesse)矩阵,计算量非常大
修正(Modified)牛顿法
用于解决海森矩阵非正定导致的方向 g k g_k gk不是下降方向,详细请百度或者参考秃优化教材
1.步长修正
2.方向修正
拟(Quasi)牛顿法
上文提到海森矩阵非常难求,那么我们就可以采取近似的办法替换它。
那么海森矩阵需要满足什么条件呢?
拟牛顿方程:
∇ θ J ( θ k + 1 ) − ∇ θ J ( θ k ) = ∇ θ 2 J ( θ k + 1 ) ( θ k + 1 − θ k ) \nabla_\theta J(\theta_{k+1})-\nabla_\theta J(\theta_k)=\nabla_\theta^2J(\theta_{k+1})(\theta_{k+1}-\theta_{k}) ∇θJ(θk+1)−∇θJ(θk)=∇θ2J(θk+1)(θk+1−θk)
那么如何找到满足这个方程的 ∇ θ 2 J ( θ k + 1 ) \nabla_\theta^2J(\theta_{k+1}) ∇θ2J(θk+1)呢?
1.DFP
2.BFGS
我不能再看秃优化了,我真的不想秃
\quad \quad\quad\quad
最小二乘法
考虑:
L i n e a r e q u a t i o n : f θ ( x ) = w 0 + w 1 x 1 + ⋯ + w n x n Linear\ equation:\ f_\theta(\mathbf x)=w_0+w_1x_1+\cdots +w_nx_n Linearequation:fθ(x)=w0+w1x1+⋯+wnxn
O b j e c t i v e : arg min θ J ( θ ) = 1 2 ∑ i = 1 N ( f θ ( x i ) − y i ) 2 Objective:\argmin_\theta J(\theta)=\frac{1}{2}\sum\limits_{i=1}^{N}(f_\theta(\mathbf x_i)-y_i)^2 Objective:θargminJ(θ)=21i=1∑N(fθ(xi)−yi)2
其 中 : X = [ ( x ( 1 ) ) T ( x ( 2 ) ) T … ( x ( n ) ) T ] 其中:X=\left[ \begin{array} {cccc} (x^{(1)})^T\\ (x^{(2)})^T\\ \ldots \\ (x^{(n)})^T \end{array} \right] 其中:X=⎣⎢⎢⎡(x(1))T(x(2))T…(x(n))T⎦⎥⎥⎤ \qquad\qquad x ( i ) = [ x 1 ( i ) x 2 ( i ) … x d ( i ) ] x^{(i)} = \left[ \begin{array} {cccc} x_1^{(i)}\\ x_2^{(i)}\\ \ldots \\ x_d^{(i)} \end{array} \right] x(i)=⎣⎢⎢⎢⎡x1(i)x2(i)…xd(i)⎦⎥⎥⎥⎤
\qquad\quad Y = [ y ( 1 ) y ( 2 ) … y ( n ) ] Y = \left[ \begin{array} {cccc} y^{(1)}\\ y^{(2)}\\ \ldots \\ y^{(n)} \end{array} \right] Y=⎣⎢⎢⎡y(1)y(2)…y(n)⎦⎥⎥⎤
那 么 有 : f θ ( x ) = X θ , 此 时 f θ ( x ) 为 向 量 那么有:f_\theta(\mathbf x)=X\theta,此时f_\theta(\mathbf x)为向量 那么有:fθ(x)=Xθ,此时fθ(x)为向量
J ( θ ) = 1 2 ( X θ − Y ) T ( X θ − Y ) \qquad \quad \quad J(\theta)=\frac{1}{2}(X\theta-Y)^T(X\theta-Y) J(θ)=21(Xθ−Y)T(Xθ−Y)
而由于线性方程的函数性质,我们只需要计算出 J ( θ ) J(\theta) J(θ)对 θ \theta θ的导数,并令其为零。
∂ J ( θ ) ∂ θ = ∂ ∂ θ 1 2 ( X θ − Y ) T ( X θ − Y ) \frac{\partial{J(\theta)}}{\partial\theta} = \frac{\partial}{\partial\theta} \frac{1}{2}(X\theta-Y)^T(X\theta-Y) ∂θ∂J(θ)=∂θ∂21(Xθ−Y)T(Xθ−Y)
= 1 2 ∂ ∂ θ ( θ T X T X θ − Y T X θ − θ T X T Y − Y T Y ) \qquad\ = \frac{1}{2}\frac{\partial}{\partial\theta} (\theta^TX^TX\theta - Y^TX\theta-\theta^T X^TY - Y^TY) =21∂θ∂(θTXTXθ−YTXθ−θTXTY−YTY)
= 1 2 ∂ ∂ θ ( θ T X T X θ − 2 θ T X T Y − Y T Y ) \qquad\ = \frac{1}{2}\frac{\partial}{\partial\theta} (\theta^TX^TX\theta - 2\theta^T X^TY - Y^TY) =21∂θ∂(θTXTXθ−2θTXTY−YTY)
= 1 2 ∂ ∂ θ θ T X T X θ − ∂ ∂ θ θ T X T Y \qquad\ = \frac{1}{2}\frac{\partial}{\partial\theta} \theta^TX^TX\theta - \frac{\partial}{\partial\theta} \theta^T X^TY =21∂θ∂θTXTXθ−∂θ∂θTXTY
t i p : ∂ x ⃗ T α ∂ x ⃗ = α , ∂ A T B ∂ x ⃗ = ∂ A T ∂ x ⃗ B + ∂ B T ∂ x ⃗ A tip:\frac{\partial \vec x^T\alpha}{\partial\vec x}=\alpha ,\frac{\partial A^TB}{\partial \vec x}= \frac {\partial A^T}{\partial \vec x}B+ \frac {\partial B^T}{\partial \vec x}A tip:∂x ∂x Tα=α,∂x ∂ATB=∂x ∂ATB+∂x ∂BTA
= 1 2 ∂ ∂ θ ( X θ ) T X θ − X T Y \qquad\ = \frac{1}{2}\frac{\partial}{\partial \theta}(X\theta)^TX\theta-X^TY =21∂θ∂(Xθ)TXθ−XTY
= 1 2 ( X T X θ + X T X θ ) − X T Y \qquad\ = \frac{1}{2}(X^TX\theta+X^TX\theta)-X^TY =21(XTXθ+XTXθ)−XTY
= X T X θ − X T Y = O u t \qquad\ = X^TX\theta -X^TY=Out =XTXθ−XTY=Out
令 O u t = 0 , 则 有 X T X θ = X T Y 令Out=0, 则有 X^TX\theta = X^TY 令Out=0,则有XTXθ=XTY
由 矩 阵 性 质 , 解 出 θ = ( X T X ) − 1 X T Y 由矩阵性质,解出\theta=(X^TX)^{-1}X^TY 由矩阵性质,解出θ=(XTX)−1XTY
\qquad\qquad
代码实战
任务:
找到一条直线与这些点的距离和最短。
100个线性噪点
调包
import numpy as npfrom sklearn.linear_model import LinearRegressionnum_dots = 100w_0 = 1.2 w_1 = 2.4# 使得每次的x都一样np.random.seed(77)x = np.ones((num_dots, 2))x[:, 1] = np.random.rand(num_dots)# 第二项加点孜然(噪音)y = x.dot([[w_0],[w_1]])+ np.random.randn(num_dots, 1)/3# 我们自己有w_0,不需要回归器帮我们添加reg = LinearRegression(fit_intercept=False)# 回归器要求 y 必须展平reg.fit(x, y.ravel())# score会计算 R^2, 原因是消除量纲不一致问题 print(reg.coef_)print(reg.score(x, y.ravel()))# [1.1363631 2.57667292]# 0.8334391043501345
手冲
最小二乘
# 实际上,上面的回归器就是一个最小二乘的抽象类def least_square(X, y):return np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)# r^2 = 1 - mse / var(y_true)def square_r(X, y, w):mse = ((X.dot(w) - y)**2).sum() / X.shape[0]var = ((y - y.mean())**2).sum() / X.shape[0]return 1 - (mse / var)w = least_square(x, y)print(w.ravel())print(square_r(x, y, w))# [1.1363631 2.57667292]# 0.8334391043501345
批量梯度下降
tolerance = 1e-5step_size = 1e-2max_iteration = 23333def gradient_operator(X, y, w):y_hat = X.dot(w)diff = y_hat - ygradient = diff.T.dot(X)return (gradient / X.shape[0]).reshape(-1, 1)def gradient_descent(X, y):# initiate w_0 w_1w = np.random.randn(2, 1)gradient_norm = 9999# 计数器k = 0while gradient_norm > tolerance and k < max_iteration:gradient = gradient_operator(X, y, w)w -= step_size * gradientgradient_norm = (gradient**2).sum() k += 1return w, kw, num_iteration = gradient_descent(x, y) print(w, num_iteration)print(square_r(x, y, w))#[[1.15804653] [2.53447806]] 5222# 0.8332124518867474
随机梯度下降
tolerance = 1e-5step_size = 1e-2max_epochs = 5000def stochastic_gradient_descent(X, y):# initiate w_0 w_1w = np.random.randn(2, 1)gradient_norm = 9999gradient_norm_sum = 9999sum_epoch = 0sum_step = 0gradient_list = []for epoch in range(max_epochs):if gradient_norm_sum < tolerance :# early stoppingbreakelse :gradient_norm_sum = 0# fetch one sample x = [a, b] target = [b]for x, target in zip(X, y):gradient = gradient_operator(x.reshape(1, -1), target, w)w -= step_size * gradientgradient_norm = (gradient**2).sum() sum_step += 1gradient_norm_sum += gradient_normgradient_norm_sum / X.shape[0]sum_epoch += 1return w, sum_epoch, sum_stepw, sum_epoch, sum_step = stochastic_gradient_descent(x, y)print(w, sum_epoch, sum_step)print(square_r(x, y, w))# [[1.14477324] [2.57607149]] 5000 500000# 0.8333393337693475
由于用来测试的数据维度不大,样本量也不多。所以几种算法结果差别不大,感兴趣的同学可以去看看他们在实际运用中的表现。
\qquad\qquad\quad
\qquad\qquad\qquad 其实我是去做梦了
参考书籍:
李航:《统计学习方法第二版》
周志华:《机器学习》(还是西瓜书好听)
参考链接:
/datawhalechina/team-learning/tree/master/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%AE%97%E6%B3%95%E5%9F%BA%E7%A1%80
如果觉得《线性回归笔记(LinearRegression)》对你有帮助,请点赞、收藏,并留下你的观点哦!