多元线性回归:梯度下降法与最小二乘法;归一化与局部加权;简单对比

机器学习(4)


在一元线性回归的梯度下降法最小二乘法中介绍了二者的原理以及公式推导的过程。
在处理多元问题时,这两种方法的原理依旧不会有变化,只是在训练模型时添加了矩阵的计算。

梯度下降法

程序实现

首先来回顾一下E的计算公式公式1.1.1
在这里插入图片描述
多元线性回归的梯度下降程序原理和一元线性回归没有区别,在设定好学习率a后就可以代入训练集计算:
训练集和初始化的K是形似如图的矩阵:
在这里插入图片描述
先初始化一些变量:

err = np.sum(X*K - Y) #误差
e = 10e-8 #我们允许的两次E差值的最大值
m = len(Y) #样本点数
a = 0.001 #初始化学习率,可能不适合这一组数据
E  = 0 #本次E
E0 = 0 #上次E
A=[0.,0.,0.] #存储当前导数值

计算E

E = err**2/2/m

求导

        for i in range(len(K)):
                A[i] = np.sum(err * X[:,i] ) / m

再梯度下降

        for i in range(len(K)):
                K[i] -= a*A[i]

然后判断 abs(E-E0) 是否 < e,是则break
否则

E0 = E #记录本次E的值
E = 0 #重置E

然后再循环,直到 abs(E-E0) < e

如果为了方便,我们可以把上式堆到while True语句里。
(其实a应该写成alpha,而K应该写成theta,其实都是一个东西)

我们也可以把它们写成函数,然后封装到一起,就不详细写了。在这里主要想介绍接下来的知识点:归一化
归一化有两种基本的方式,分别是线性函数归一化和0均值归一化:

线性函数归一化

公式1.2.1
在这里插入图片描述
Xmax 和 Xmin分别是这一组中的最大和最小值,X是未归一化的旧数据,X‘是归一化以后的新数据。

0均值标准化

公式1.2.2
在这里插入图片描述
μ是样本数据的均值,σ是样本数据的标准差。

两种归一化的区别

由于在我的专业中涉及控制、信号等问题较多,对我个人而言,归一化十分重要。刚刚介绍的两种归一化是各有适用场景的。

二者的直接区别如图:

在这里插入图片描述

  • 线性函数归一化的显著特征就是:等比例缩放

比如,有28个[0, 4095]区间的数据,在归一化以后,这28个数据依旧保持原有的倍数;
或者在图像处理时,由RGB图像转化为灰度图像以后,每个像素点的灰度都是在[0, 255]区间里,并且各个数据依旧保持原有的比例。

我们并不希望归一化以后的各数据之间的比例发生改变,防止控制器造成错误的判断,这时,我们就需要用到类似线性函数归一化这样的方法处理数据。

  • 而0均值归一化,往往适用于需要去量纲化、距离度量、降维等情况。

什么叫去量纲化呢?简单地说就是把各个数据之间单位的差别给去掉。
常见的距离度量有欧氏距离、曼哈顿距离等等。
降维就是把一些复杂的高维的数据转化成低维度,便于我们计算、可视化等等。
(这三条说得很浅,在这里只是简略地提一下)
比如:
现有训练集:
x1=[1 2 8 4 6](阳台数)
x2=[9856, 8759, 7653, 9472, 8991](使用面积)
y=[430.608, 389.087, 375.079, 430.896, 421.413](房子价格)
(这是与实际不符的数据,仅举反例用)
最后算出来的θ应是[1.2, 5.6, 0.043]。(b、k1、k2)。

若我们没有使用归一化,由於单位的不统一,程序在计算的时候很容易就会溢出:
在这里插入图片描述
不想溢出的话,又要经过非常多次的运算:
在这里插入图片描述
当我们需要对这样的训练集进行线性拟合时,若不归一化,程序在梯度下降的时候效率会非常低,最终结果可能也不是很好。此时我们就需要类似0均值归一化这种能够去量纲的归一化方法,来保证梯度下降的效率。

两种方式各有优劣,在归一化数据的时候需要我们自己根据实际情况选择方法。

最小二乘法

计算公式

公式2.1.1
在这里插入图片描述
公式来源在已经在上一期的末尾讲过了,虽然上一期是用的一元线性回归解释,不过其原理是一样的。

程序实现

(列向量)

K = (X.T * X).I * X.T * Y

实现原理虽然很简单,但是只适合线性的数据拟合,在面对非线性的数据,或者样本点不够多时计算出的结果往往会发生欠拟合现象。

为了解决欠拟合的问题,我们可以给某些点增加一点权重,人为引入偏差,从而减小整体的均方误差。比如接下来将介绍的“局部加权

局部加权

先放公式,随后解释:公式2.2.1
在这里插入图片描述

与前文的公式相比多了一个W对角矩阵,权重矩阵。
求权重最常用的公式如图:公式2.2.2
在这里插入图片描述
到后面我们就会知道,这是高斯核对应的权重。其中,x是我们要加权的点;xi是其他样本点,x和xi越接近,w(i,i)越大。
k是我们自己选定的参数,k越小,x点附近被用于训练回归模型的点越少。

例:
若我们要给样本的第一个数据加权,即X[0]

m = len(Y)
w = np.eye(m) #创建对角矩阵
k = 0.1 #这个值仅举例用
for i in range(m):
    X_X = X[0] - X[i,:]
    w[i,i] = exp(X_X * X_X.T / (-2.0*k**2))

如此我们便完成了单个点的加权,然后再代入公式2.2.1计算出K:
即.

K = (X.T * w * X).I * X.T * w * Y

然后再计算出,由这个经过加权后的点预测的值:

Y[0] = K*X[0]

但这仅仅是一个点的加权,而且想这么写程序很麻烦,我们可以把其他的点也分别加权:

  • 我们先把刚刚的单个点程序写为函数:
def One_Point(Xtest,X,Y,k):# Xtest是我们要加权的样本点
    # 略
    return K*Xtest
  • 然后就可以不断调用它,从而给其他点加权后再预测值
for i in range(m):
    Y[i] = One_Point(X[i],X,Y,0.1)

用局部加权方法,可以适当地解决一些欠拟合的问题。

简单地对比

最小二乘法 梯度下降法
公式计算 迭代计算
无学习率 有学习率
不需归一化 需要归一化
与起点无关 与起点有关
全局最小 局部最小

最小二乘法的优点就是可以由公式直接得到线性回归方程,但是计算过于复杂。
当样本点和特征值过多时,比如有100 000个样本点,10 000个特征值的时候,用最小二乘法就会对计算机造成很大的负担,耗费很长时间。此时我们就应该用梯度下降法。
有时XTX并没有逆矩阵,面对这样或者其他的复杂情况时,梯度下降法往往是更好的选择。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章