断断续续的看了一些课程,一些书,对于机器学习的一些知识有了一个初步的熟悉,但感觉看完再想起来就没那么清楚了,所以希望还是自己坚持写一些东西,只当是自己所学的一个总结和回顾,日后有了更深的理解了也方便回过头来再看再完善。那就先从第一个最基本的算法学习吧,那就是线性回归(LinearRegression)。
线性回归主要包括高斯分布、最大似然估计、最小二乘法、梯度下降等一些内容。线性回归本身的原理并不难理解,因此下面主要从数学推导和代码实现由内到外的学习
Stanford机器学习-Linear Regressioon with One Variable(1)
Stanford机器学习-Linear Regressioon with One Variable(2)
Stanford机器学习-Linear Regressioon with One Variable(3)
数学推导
我们在预测房屋价格的背景下来看,假设数据集如下所示:
它在坐标图中的点分布大概为:
目标是希望在给定的数据集中找到一条线可以很好的来拟合这些数据。假设每个样本对应的特征记为
x
1
(
i
)
,
x
2
(
i
)
,
…
…
,
x
n
(
i
)
x_{1}^{(i)},x_{2}^{(i)},……,x_{n}^{(i)}
x1(i),x2(i),……,xn(i),每个样本所对应的结果为
y
i
y_{i}
yi。具体到这个例子中所使用的特征有Living area、bedrooms和price三个,因此拟合直线方程为:
h
θ
(
x
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
h
θ
(
x
)
=
∑
i
=
0
n
θ
i
x
i
=
θ
T
x
h_{\theta}(x) = \theta_{0}+ \theta_{1}x_{1}+ \theta_{2}x_{2} \\ h_{\theta}(x) = \sum_{i=0}^n \theta_{i}x_{i} = \theta^{T}x
hθ(x)=θ0+θ1x1+θ2x2hθ(x)=i=0∑nθixi=θTx
对于给定的数据集来说,
x
i
x_{i}
xi是已知的,而
θ
i
\theta_{i}
θi是未知的。为了方便我们将其写成是关于
x
x
x和
θ
θ
θ的向量。在真实使用的数据种必然存在一定量的噪声,故加入了噪声的拟合方程为:
y
i
=
θ
T
x
(
i
)
+
ϵ
(
i
)
y^{i} = \theta^{T}x^{(i)} + \epsilon^{(i)}
yi=θTx(i)+ϵ(i)
假设误差项满足高斯分布:
p
(
ϵ
(
i
)
)
=
1
2
π
σ
exp
(
−
(
ϵ
(
i
)
)
2
2
σ
2
)
p(\epsilon^{(i)}) = \frac{1}{\sqrt{2 \pi \sigma}} \exp(-\frac{(\epsilon^{(i)})^2}{2 \sigma^2})
p(ϵ(i))=2πσ1exp(−2σ2(ϵ(i))2)。那么给定数据
x
i
x_{i}
xi和对应的模型参数
θ
\theta
θ时,求解对应的
y
(
i
)
y^{(i)}
y(i)的概率可表示为:
p
(
y
(
i
)
∣
x
(
i
)
;
θ
)
=
1
2
π
σ
exp
(
−
(
y
(
i
)
−
θ
T
x
(
i
)
2
)
2
σ
2
)
L
(
θ
)
=
∏
i
=
1
m
p
(
y
(
i
)
∣
x
(
i
)
;
θ
)
=
∏
i
=
1
m
1
2
π
σ
exp
(
−
(
y
(
i
)
−
θ
T
x
(
i
)
2
)
2
σ
2
)
p(y^{(i)}|x^{(i)};\theta) = \frac{1}{\sqrt{2 \pi \sigma}} \exp(-\frac{(y^{(i)}-\theta^{T}x^{(i)^2})}{2 \sigma^2}) \\ L(\theta) = \prod_{i=1}^{m}p(y^{(i)}|x^{(i)};\theta) = \prod_{i=1}^m \frac{1}{\sqrt{2 \pi \sigma}} \exp(-\frac{(y^{(i)}-\theta^{T}x^{(i)^2})}{2 \sigma^2})
p(y(i)∣x(i);θ)=2πσ1exp(−2σ2(y(i)−θTx(i)2))L(θ)=i=1∏mp(y(i)∣x(i);θ)=i=1∏m2πσ1exp(−2σ2(y(i)−θTx(i)2))
然后使用最大似然估计计算,过程为: ℓ ( θ ) = log L ( θ ) = log ∏ i = 1 m 1 2 π σ exp ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) = ∑ i = 1 m log 1 2 π σ exp ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) = m log 1 2 π σ − 1 σ 2 ⋅ 1 2 ∑ i = 1 m ( y ( i ) − θ T x ( i ) ) 2 \begin{aligned} \ell(\theta) &=\log L(\theta) \\ &=\log \prod_{i=1}^{m} \frac{1}{\sqrt{2 \pi} \sigma} \exp \left(-\frac{\left(y^{(i)}-\theta^{T} x^{(i)}\right)^{2}}{2 \sigma^{2}}\right) \\ &=\sum_{i=1}^{m} \log \frac{1}{\sqrt{2 \pi} \sigma} \exp \left(-\frac{\left(y^{(i)}-\theta^{T} x^{(i)}\right)^{2}}{2 \sigma^{2}}\right) \\ &=m \log \frac{1}{\sqrt{2 \pi} \sigma}-\frac{1}{\sigma^{2}} \cdot \frac{1}{2} \sum_{i=1}^{m}\left(y^{(i)}-\theta^{T} x^{(i)}\right)^{2} \end{aligned} ℓ(θ)=logL(θ)=logi=1∏m2πσ1exp(−2σ2(y(i)−θTx(i))2)=i=1∑mlog2πσ1exp(−2σ2(y(i)−θTx(i))2)=mlog2πσ1−σ21⋅21i=1∑m(y(i)−θTx(i))2
上式中第一项为常数,第二项为关于 θ \theta θ的表达式。将其拿出来记为 J ( θ ) J(\theta) J(θ),即: J ( θ ) = 1 2 ∑ i = 1 m ( h t h e t a ( x ( i ) ) − y ( i ) ) 2 J(\theta) = \frac{1}{2} \sum_{i=1}^m (h_{theta}(x^{(i)})-y^{(i)})^2 J(θ)=21i=1∑m(htheta(x(i))−y(i))2
将其向量化:将其 M M M个 N N N维的样本组成矩阵 X X X,得到的目标函数为: J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 = 1 2 ( X θ − y ) T ( X θ − y ) J(\theta)=\frac{1}{2} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}=\frac{1}{2}(X \theta-y)^{T}(X \theta-y) J(θ)=21i=1∑m(hθ(x(i))−y(i))2=21(Xθ−y)T(Xθ−y)
通常使用梯度下降法来求关于解析式的一个极小值点,梯度下降的方法通常有三种,分别是批量梯度下降、随机梯度下降和小批量梯度下降:
- 批量梯度下降: θ j = θ j + 1 m ∑ i = 1 m ( Y ( i ) − h θ ( X ( i ) ) ) X j ( i ) \theta_{j}=\theta_{j}+\frac{1}{m} \sum_{i=1}^{m}\left(Y^{(i)}-h_{\theta}\left(X^{(i)}\right)\right) X_{j}^{(i)} θj=θj+m1∑i=1m(Y(i)−hθ(X(i)))Xj(i)
- 随机梯度下降: θ j = θ j + ( Y ( i ) − h θ ( X ( i ) ) ) X j ( i ) \theta_{j}=\theta_{j}+\left(Y^{(i)}-h_{\theta}\left(X^{(i)}\right)\right) X_{j}^{(i)} θj=θj+(Y(i)−hθ(X(i)))Xj(i)
- 小批量梯度下降: θ j = θ j + 1 i + α ∑ k = 1 i + α ( Y ( k ) − h θ ( X ( k ) ) ) X j ( k ) \theta_{j}=\theta_{j}+\frac{1}{i+\alpha} \sum_{k=1}^{i+\alpha}\left(Y^{(k)}-h_{\theta}\left(X^{(k)}\right)\right) X_{j}^{(k)} θj=θj+i+α1∑k=1i+α(Y(k)−hθ(X(k)))Xj(k)
批次大小依内存和处理效率而定。
梯度下降通常还有一个学习率的问题,一般来说,模型训练之初通常选择一个较小的学习率,后面再根据效果进行不断调整。 不同学习率造成的不同影响:
对上式向量化和求梯度: ∇ θ J ( θ ) = ∇ θ ( 1 2 ( X θ − y ) T ( X θ − y ) ) = ∇ θ ( 1 2 ( θ T X T − y T ) ( X θ − y ) ) = ∇ θ ( 1 2 ( θ τ X τ X θ − θ T X τ y − y τ X θ + y T y ) ) = 1 2 ( 2 X T X θ − X T y − ( y T X ) Y ) = X T X θ − X T y \begin{aligned} &\nabla_{\theta} J(\theta)=\nabla_{\theta}\left(\frac{1}{2}(X \theta-y)^{T}(X \theta-y)\right)=\nabla_{\theta}\left(\frac{1}{2}\left(\theta^{T} X^{T}-y^{T}\right)(X \theta-y)\right)\\ &=\nabla_{\theta}\left(\frac{1}{2}\left(\theta^{\tau} X^{\tau} X \theta-\theta^{T} X^{\tau} y-y^{\tau} X \theta+y^{T} y\right)\right)\\ &=\frac{1}{2}\left(2 X^{T} X \theta-X^{T} y-\left(y^{T} X\right)^{Y}\right)=X^{T} X \theta-X^{T} y \end{aligned} ∇θJ(θ)=∇θ(21(Xθ−y)T(Xθ−y))=∇θ(21(θTXT−yT)(Xθ−y))=∇θ(21(θτXτXθ−θTXτy−yτXθ+yTy))=21(2XTXθ−XTy−(yTX)Y)=XTXθ−XTy
得 θ = ( X T X ) − 1 X t y \theta = (X^TX)^{-1}X^ty θ=(XTX)−1Xty
代码实现
在知道了数学推导后,如何在代码中实现才是最接合实际应用的。这里使用python语言,包括numpy、matplotlib、pandas、sklearn等第三方的库,这样我们就不必自己来写具体的数据拟合过程,只需要调用库就好了。具体的实现代码为:
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model
class my_linear_model():
def __init__(self):
self.alpha = 0.1
def load_data(self,path):
data = pd.read_csv(path)
return data
def train_model(self,traindata,features,labels):
model = linear_model.LinearRegression()
model.fit(traindata[features],traindata[labels])
return model
def visual_model(self,model,data,features,lables,error,score):
plt.rcParams['font.sans-serif'] = ['SimHei']
fig = plt.figure(figsize=(6,6),dpi = 90)
ax = fig.add_subplot(111)
ax.set_title(u'%s' % "LinearRegression")
ax.set_xlabel('$x$')
ax.set_ylabel('$y$')
ax.scatter(data[features],data[lables],color = 'b',
label=u'%s: $y = x + \epsilon$' % "真实值" )
# 根据截距的正负,打印不同的标签
if model.intercept_ > 0:
# 画线图,用红色线条表示模型结果
ax.plot(data[features], model.predict(data[features]), color='r',
label=u'%s: $y = %.3fx$ + %.3f'\
% ("预测值", model.coef_, model.intercept_))
else:
ax.plot(data[features], model.predict(data[features]), color='r',
label=u'%s: $y = %.3fx$ - %.3f'\
% ("预测值", model.coef_, abs(model.intercept_)))
legend = plt.legend(shadow=True)
legend.get_frame().set_facecolor('#6F93AE')
# 显示均方差和决定系数
ax.text(0.99, 0.01,
u'%s%.3f\n%s%.3f'\
% ("均方差:", error, "决定系数:", score),
style='italic', verticalalignment='bottom', horizontalalignment='right',
transform=ax.transAxes, color='m', fontsize=13)
plt.show()
def evaluate_model(self,model,testData,features,labels):
error = np.mean((model.predict(testData[features]) - testData[labels]) ** 2)
score = model.score(testData[features],testData[labels])
return error,score
def lr_model(self,data):
features = ["x"]
labels = ["y"]
train_data = data[:15]
test_data = data[15:]
model = self.train_model(train_data,features,labels)
error,score = self.evaluate_model(model,test_data,features,labels)
self.visual_model(model,data,features,labels,error,score)
if __name__ == "__main__":
path =u'simple_example.csv'
m = my_linear_model()
data = m.load_data(path)
m.lr_model(data)
实验结果为:
小象学院的邹博老师的《机器学习》课程
周志华《机器学习》
李航《统计学习方法》
思考
1. 为什么我们在线性回归中使用的损失函数是平方误差函数?
在线性回归中选用误差平方和作为误差函数,其实就是将误差假定为了均值为0的高斯分布。这也就是为什么还会存在sigmoid逻辑回归(以伯努利分布分析误差),以及softmax等一般线性回归(以指数分布分析误差)。
假设模型结果与测量值误差满足均值为0的高斯分布,即正态分布。这个假设是靠谱的,符合一般客观统计规律。如下所示数据x与y的条件概率为: p ( y ( i ) ∣ x ( i ) ; θ ) = 1 2 π σ exp ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) p\left(y^{(i)} | x^{(i)} ; \theta\right)=\frac{1}{\sqrt{2 \pi} \sigma} \exp \left(-\frac{\left(y^{(i)}-\theta^{T} x^{(i)}\right)^{2}}{2 \sigma^{2}}\right) p(y(i)∣x(i);θ)=2πσ1exp(−2σ2(y(i)−θTx(i))2)
若使模型预测结果和真实数据接近,即要求其概率积(概率密度函数的连续积)就最大。这样就形成了一个最大似然函数估计,对最大似然函数估计进行推导,就得出了求导后结果。
2. 常见的损失函数有哪些?
-
0-1损失函数: L ( Y , f ( X ) ) = { 1 , Y ≠ f ( X ) 0 , Y = f ( X ) L(Y, f(X))=\left\{\begin{array}{ll} {1,} & {\mathrm{Y} \neq \mathrm{f}(\mathrm{X})} \\ {0,} & {\mathrm{Y}=\mathrm{f}(\mathrm{X})} \end{array}\right. L(Y,f(X))={1,0,Y=f(X)Y=f(X)
-
平方损失函数: L ( Y , f ( X ) ) = ( Y − f ( X ) ) 2 L(Y,f(X)) = (Y-f(X))^2 L(Y,f(X))=(Y−f(X))2
-
绝对损失函数: L ( Y , f ( X ) ) = ∣ Y − f ( X ) ∣ L(Y,f(X)) = |Y-f(X)| L(Y,f(X))=∣Y−f(X)∣
-
对数损失函数: L ( Y , P ( Y ∣ X ) = − log P ( Y ∣ X ) L(Y,P(Y|X) = -\log P(Y|X) L(Y,P(Y∣X)=−logP(Y∣X)
3. 为什么要进行数据的归一化和标准化?
为了在梯度下降计算中,加快梯度下降的速度。标准化后将每个属性的值控制在
−
1
∼
+
1
-1 \sim +1
−1∼+1之间,而归一化后将每个特征的尺度控制在相同的范围之内。
4. 如何解决过拟合问题呢?
常见的方法有两种:
• 减少特征的数量,有人工选择模型选择等算法
• 正则化,即保留所有特征,但降低参数的值的影响。优点:特征很多时,每个特征都会有一个合适的影响因子。而正则化主要是L1正则化和L2正则化,使用L1正则化的回归算法叫Lasso回归,使用L2正则化的回归算法叫Ridge回归。
-
L1正则化: J ( w ) = 1 2 m [ ∑ i = 1 m ( h w ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n ∣ w j ∣ J(w)=\frac{1}{2 m}\left[\sum_{i=1}^{m}\left(h_{w}\left(x^{(i)}\right)-y^{(i)}\right)^{2}+\lambda \sum_{j=1}^{n}\left|w_{j}\right|\right. J(w)=2m1[∑i=1m(hw(x(i))−y(i))2+λ∑j=1n∣wj∣
-
L2正则化: J ( w ) = 1 2 m [ ∑ i = 1 m ( h w ( x ( i ) ) − y ( i ) ) 2 ] + λ ∑ j = 1 n w j 2 J(w)=\frac{1}{2 m}\left[\sum_{i=1}^{m}\left(h_{w}\left(x^{(i)}\right)-y^{(i)}\right)^{2}\right]+\lambda \sum_{j=1}^{n} w_{j}^{2} J(w)=2m1[∑i=1m(hw(x(i))−y(i))2]+λ∑j=1nwj2
5. 在Lasso回归中使用什么方法求解?
如下所示Lasso回归的表达式为:
J
(
w
)
=
1
2
m
[
∑
i
=
1
m
(
h
w
(
x
(
i
)
)
−
y
(
i
)
)
2
+
λ
∑
j
=
1
n
∣
w
j
∣
J(w)=\frac{1}{2 m}\left[\sum_{i=1}^{m}\left(h_{w}\left(x^{(i)}\right)-y^{(i)}\right)^{2}+\lambda \sum_{j=1}^{n}\left|w_{j}\right|\right.
J(w)=2m1[i=1∑m(hw(x(i))−y(i))2+λj=1∑n∣wj∣
其中,m为样本个数,n为特征个数。
由于lasso回归的损失函数是不可导的,所以梯度下降算法将不再有效,故利用坐标轴下降法进行求解。坐标轴下降法和梯度下降法具有同样的思想,都是沿着某个方向不断迭代,但是梯度下降法是沿着当前点的负梯度方向进行参数更新,而坐标轴下降法是沿着坐标轴的方向。
坐标轴下降法进行参数更新时,每次总是固定另外n-1个值,求另外一个的局部最优值,这样也避免了Lasso回归的损失函数不可导的问题。坐标轴下降法每轮迭代都需要O(mn)的计算。
数学依据:对于一个可微凸函数,如果对于一个解,使得在某个坐标轴上都能达到最小值,则就是的全局的最小值点。
6. 最小二乘法怎么解决线性回归问题?
#最小二乘法计算回归系数。xArr为样本数据集,包含m个对象,n种属性。yarr为结果数据集
def standRegres(xArr,yArr):
xMat = np.mat(xArr) #转化为x矩阵。自动形成m行n列
yMat = np.mat(yArr).reshape(len(yArr),1) #转化为y列向量
xTx = xMat.T * xMat #根据文中推导的公示计算回归系数
if np.linalg.det(xTx) == 0.0: #对不能求逆的结果返回
print("矩阵为奇异矩阵,不能求逆")
return
ws = xTx.I * (xMat.T*yMat) #最小二乘求导出为0时的权重向量
return ws
7. 梯度下降法怎么解决线性回归问题?
#梯度下降法计算回归系数。xArr为属性数据集,每行为一个对象。yArr为结果数据集,每行为一个对象的结果。
def gradAscent(xArr,yArr):
#转换成numpy的矩阵。xMatrix每行为一个对象,每列为一种特征属性
xMatrix = np.mat(xArr)
#转换成numpy的矩阵,并变维成列向量
yMatrix = np.mat(yArr).reshape(len(yArr),1)
#返回dataMatrix的大小。m为样本对象的个数,n为列数。
m, n = np.shape(xMatrix)
#移动步长,也就是学习速率,控制更新的幅度。
alpha = 0.001
maxCycles = 500
#初始化权重列向量
weights = np.ones((n,1))
for k in range(maxCycles):
#梯度上升矢量化公式,计算预测值(列向量)
h = xMatrix * weights
#计算误差
error = h - yMatrix
# 调整回归系数
weights = weights - alpha * 2 * xMatrix.T * error
return weights.getA()
8. 随机梯度下降法怎么解决线性回归问题?
#随机梯度下降法计算回归系数
def randgradAscent(xArr,yArr):
#转换成numpy的矩阵。xMatrix每行为一个对象,每列为一种特征属性
xMatrix = np.mat(xArr)
#转换成numpy的矩阵,并变维成列向量
yMatrix = np.mat(yArr).reshape(len(yArr),1)
#返回dataMatrix的大小。m为样本对象的个数,n为列数。
m, n = np.shape(xMatrix)
#最大迭代次数
maxCycles = 100
#初始化权重列向量
weights = np.ones((n,1))
for i in range(maxCycles):
for k in range(m):
# 降低alpha的大小,每次减小1/(j+i)。刚开始的时候可以步长大一点,后面调整越精细
alpha = 4 / (1.0 + i + k) + 0.01
#随机梯度上升矢量化公式,计算预测值y
h = xMatrix[k] * weights
#计算误差
error = h - yMatrix[k]
# 调整回归系数
weights = weights - 2*alpha * xMatrix[k].T * error
return weights.getA()
9. 数据的中心化处理
在机器学习及神经网络的中,通常需要对原始数据进行中心化(Zero-centered、Mean-subtraction)处理和标准化(Standardization或Normalization)处理。
• 目的:通过中心化和标准化处理,得到均值为0,标准差为1的服从标准正态分布的数据。
• 计算过程:
x
′
=
x
−
μ
σ
x' = \frac{x - \mu}{\sigma}
x′=σx−μ
下面解释一下为什么需要使用这些数据预处理步骤。
在一些实际问题中,我们得到的样本数据都是多个维度的,即一个样本是用多个特征进行表征。比如在预测房价的问题中,影响房价的因素有房子面积x1、卧室数量x2等,我们得到的样本数据就是(x1,x2)这样一些样本点,这里的x1,x2又被称为特征。很显然,这些特征的量纲和数值得量级都是不一样的,在预测房价时,如果直接使用原始的数据值,那么他们对房价的影响程度将是不一样的,而通过标准化处理,可以使得不同的特征具有相同的尺度(Scale)。这样,在使用梯度下降法学习参数的时候,不同特征对参数的影响程度就一样了。
简言之,当原始数据不同维度上的特征的尺度(单位)不一致时,需要标准化步骤对数据进行预处理。
下图中以二维数据为例:左图表示的是原始数据;中间的是中心化后的数据,数据被移动大原点周围;右图将中心化后的数据除以标准差,得到为标准化的数据,可以看出每个维度上的尺度是一致的(红色线段的长度表示尺度)。
其实,在不同的问题中,中心化和标准化有着不同的意义,
• 比如在训练神经网络的过程中,通过将数据标准化,能够加速权重参数的收敛。
• 另外,对于主成分分析(PCA)问题,也需要对数据进行中心化和标准化等预处理步骤。
10. 早期停止法(early stopping)
在执行梯度下降时,当验证误差达到最小值时停止训练,认为这时的模型是最好。一般而言,对于随机梯度下降和小批量梯度下降而言,曲线没有这么平滑,所以很难知道是否已经到达了最小值,一种解决办法就是等验证误差超过最小值一段时间后再停止,然后将模型参数回滚到误差最小的位置。
from sklearn.base import clone
sgd_reg = SGDRegressor(max_iter=1, tol=-np.infty, warm_start=True, penalty=None,
learning_rate="constant", eta0=0.0005, random_state=42)
minimum_val_error = float("inf")
best_epoch = None
best_model = None
for epoch in range(1000):
sgd_reg.fit(X_train_poly_scaled, y_train) # continues where it left off
y_val_predict = sgd_reg.predict(X_val_poly_scaled)
val_error = mean_squared_error(y_val, y_val_predict)
if val_error < minimum_val_error:
minimum_val_error = val_error
best_epoch = epoch
best_model = clone(sgd_reg)
Print (best_epoch, best_model)
11. 弹性网(ElasticNet)
ElasticNet 是一种线性回归模型,它是岭回归和Lasso回归的中间地带,正则化项就是岭回归和Lasso回归的正则项的混合。这种组合允许学习一个稀疏模型,其中很少的权重是非零的,如 Lasso ;同时仍然保持 Ridge 的正则化属性,我们使用 ρ 参数控制 L1 和 L2 的凸组合。
它的成本函数是: min w 1 2 n samples ∥ X w − y ∥ 2 2 + α ρ ∥ w ∥ 1 + α ( 1 − ρ ) 2 ∥ w ∥ 2 2 \min _{w} \frac{1}{2 n_{\text {samples}}}\|X w-y\|_{2}^{2}+\alpha \rho\|w\|_{1}+\frac{\alpha(1-\rho)}{2}\|w\|_{2}^{2} wmin2nsamples1∥Xw−y∥22+αρ∥w∥1+2α(1−ρ)∥w∥22
那么如何选择常用的这三种线性回归模型呢?一般来说,应该避免使用纯线性回归,岭回归往往可以有不错的效果。但当你实际使用的特征只有那么几个时,就更倾向于使用Lasso回归和弹性网,因为他们会将无用特征的权重降为零,其中弹性网的效果一般又会好于Lasso回归。
12. 如果运行的时间足够的长,是否所有的梯度下降方法得到的模型会是一样的?
如果问题都是凸优化问题,而且学习率设置的不是很大,那么所有的梯度下降算法都可以接近全局最优,最终生成的模型非常相似。但是,除非逐渐地降低学习率,否则随机梯度下降和小批量梯度下降都不会真正的收敛,他们会在全局最优值附近不断地波动。所以说,批量梯度下降经过足够长的时间训练可以真正收敛,而随机梯度下降和小批量梯度下降将围绕最小值上下波动。