糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > 线性回归笔记(LinearRegression)

线性回归笔记(LinearRegression)

时间:2022-02-06 06:18:59

相关推荐

线性回归笔记(LinearRegression)

目录

线性回归模型概述优点和缺点基本形式 策略策略即是损失函数,代价函数,目标函数的具体定义如何从概率论的角度看损失函数 ?为什么需要目标函数 ?构造和优化目标函数经验风险(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​+θ1​x1​+θ2​x2​+...+θd​xd​=i=0∑d​θi​xi​

策略

策略即是损失函数,代价函数,目标函数的具体定义

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​+w1​x+w2​x2+⋯+wM​xM=i=0∑M​wi​xix,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)=21​i=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)=N1​i=1∑N​L(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)=N1​i=1∑N​L(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∈Fmin​N1​i=1∑N​L(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​=[∇θ2​J(θ)]−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​)=∇θ2​J(θk+1​)(θk+1​−θk​)

那么如何找到满足这个方程的 ∇ θ 2 J ( θ k + 1 ) \nabla_\theta^2J(\theta_{k+1}) ∇θ2​J(θ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​+w1​x1​+⋯+wn​xn​

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:θargmin​J(θ)=21​i=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 ∂AT​B+∂x ∂BT​A

= 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)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。