最小二乘法的线代表示#
给定m个数据点 (xi,yi),我们希望找到一个函数 f(x) 来拟合这些数据点
设拟合目标函数为:
f(x)=a0+a1x+a2x2+⋯+anxn=[1xx2⋯xn]a0a1a2⋮an所以我们的目标就是求解参数向量 a=[a0,a1,a2,⋯,an]T
于是可以将该拟合问题转化成一个解线性方程组问题:
将每个数据点 (xi,yi) 代入拟合函数 f(x) 中,我们得到以下超定方程组(m>n):
111⋮1x1x2x3⋮xmx12x22x32⋮xm2⋯⋯⋯⋱⋯x1nx2nx3n⋮xmna0a1a2⋮an=y1y2y3⋮ym简写为:
Xa=y可以看到X的维度是m×(n+1),这个方程肯定是无精确解的,所以我们需要定义残差向量(损失)r为真实值与预测值之差:
r=y−Xa但r是一个向量,为了直观且便于计算,通常使用残差平方和(RSS)来衡量拟合的好坏:
RSS(a)=∥r∥2=(y−Xa)T(y−Xa)为了找到RSS(a)的最小值,我们对a求导并设置为零:
∂a∂RSS=−2XT(y−Xa)=−2XTy+2XTXa设置导数为零:
−2XTy+2XTXa=0简化得到了最小二乘法的正规方程:
a=(XTX)−1XTy如果此时XTX恰好满秩(可逆)且是良态,那就直接解吧
什么是良态&病态&条件数
如果XTX不可逆或病态怎么办#
SVD奇异值分解(伪逆)#
其实用这个方法的话不到正规方程那步就可以
Xa=UΣVT=X−1y=X†y=VΣ†UTyΣ†是Σ的伪逆,计算方法是将Σ中非零奇异值取倒数,0奇异值保持为0,然后转置
除了又重又慢以外毫无缺点
L2正则化(岭回归, Ridge, Tikhonov正则化)#
正则化就是在残差基础上加上一个惩罚项,来限制模型的复杂度,防止数值不稳定
J(a)=RSS(a)+λ∥a∥22=(y−Xa)T(y−Xa)+λaTa直观上理解就像用一个圆形围墙将a限制在一个范围内,当∥a∥2变大,损失会迅速增大,所以岭回归这个名字很形象
对J(a)求导并设置为零:
∂a∂J=−2XT(y−Xa)+2λa=−2XTy+2XTXa+2λa设置导数为零得到带L2正则化的正规方程:
a=(XTX+λI)−1XTy其中I是单位矩阵,λ是正则化强度的超参数,通常需要通过交叉验证来选择合适的λ值
L1正则化(套索回归, Lasso)#
L1正则化的损失函数定义为:
J(a)=RSS(a)+λ∥a∥1=(y−Xa)T(y−Xa)+λi=1∑n∣ai∣这东西有绝对值,不可导,也就没有对应的正规方程,只能用数值优化方法来求解
其中一个最常见的是坐标下降法,它的核心思想是每次固定其他参数,只优化一个参数,交替进行直到收敛
优化目标:
amin21∥y−Xa∥22+λ∥a∥1TIPRSS(a)变成21∥y−Xa∥22是因为在优化过程中这两个损失是等价的(都是二次函数),21纯是为了求导完跟2消掉好看
计算部分残差:
ρj=xjT(y−k=j∑akxk)其中xj是X的第j列,ak是参数向量a的第k个元素,左乘xjT是投影(内积),部分残差的含义为「当第j个参数不参与拟合时,剩余的误差与第j个特征的相关程度」
软阈值算子:
aj=⎩⎨⎧∥xj∥2ρj∥xj∥2ρj−λ∥xj∥2ρj+λ0if j=0(偏移量)if ρj>λif ρj<−λif ∣ρj∣≤λ原理是ρj大于∣λ∣就往里收一点,小于就直接变0,把偏移量单独拿出来是防止偏移量被限制活动范围,导致无法拟合偏离中心的数据,除以∥xj∥2是为了归一化特征的尺度
部分更新残差向量:
为了避免每次迭代都重新计算巨大的矩阵乘法,所以采用增量更新
rnew=rold−xj(aj−ajold)
矩阵的条件数#
理论上可逆不代表工程上真的能用,因为数值计算中可能会遇到病态矩阵,即矩阵的条件数非常大,导致解不稳定
矩阵X的条件数定义为:
κ(X)=∥X∥⋅∥X−1∥其中∥⋅∥表示某种范数,κ(X)∈[1,+∞)
- 良态: κ(X)接近1,说明X的列向量之间强线性无关(高度正交),解稳定
- 病态: κ(X)很大,说明X的列向量之间接近线性相关,解不稳定,对输入的微小变化可能导致输出的巨大变化
Hager算法#
Hager算法用于估算条件数公式中的∥A−1∥:
优化目标:
max∥A−1v∥1其中 ∥v∥1=1在单位球面上找一个向量v,使得被A−1变换后的向量最长
- 先随机选一个初始向量b
- 解方程组Ax=b(使用LU分解),得到x=A−1b
- 对f=∥x∥1求梯度
∇bf=(∂b∂x)T∇xf=(A−1)T∇xf=(AT)−1∇xf因为绝对值函数的梯度是符号函数,所以∇xf=sign(x)
得到:
zATz=(AT)−1sign(x)=sign(x)解方程组ATz=sign(x)得到z(刚刚已经对A进行过LU分解,此步很快),得到绝对值最大分量的索引j=argmaxi∣zi∣,如果∣zj∣>zTb,说明在j的方向上可以找到一个更大的值,所以更新b为单位向量ej并重复以上过程,否则说明已经找到最大值了,此时b就是算法结果