梯度下降与正规方程

梯度下降法

梯度下降是一个最优化算法,通俗的来讲也就是沿着梯度下降的方向来求出一个函数的极小值。那么我们在高等数学中学过,对于一些我们了解的函数方程,我们可以对其求一阶导和二阶导,比如说二次函数。可是我们在处理问题的时候遇到的并不都是我们熟悉的函数,并且既然是机器学习就应该让机器自己去学习如何对其进行求解,显然我们需要换一个思路。因此我们采用梯度下降,不断迭代,沿着梯度下降的方向来移动,求出极小值。

此处我们还是用coursea的机器学习课中的案例,假设我们从中介那里拿到了一个地区的房屋售价表,那么在已知房子面积的情况下,如何得知房子的销售价格。显然,这是一个线性模型,房子面积是自变量x,销售价格是因变量y。我们可以用给出的数据画一张图。然后,给出房子的面积,就可以从图中得知房子的售价了。

现在我们的问题就是,针对给出的数据,如何得到一条最拟合的直线。

对于这个模型:其拟合直线方程为:
h(x) = θ0 + θ1x1;

现在我们要通过梯度下降来求θ0和θ1,以便求出h(x),即与数据最拟合的直线方程

对于线性模型,如下。

  • h(x)是需要拟合的函数。
  • J(θ)称为均方误差或cost function。用来衡量训练集众的样本对线性模式的拟合程度。
  • m为训练集众样本的个数。
  • θ是我们最终需要通过梯度下降法来求得的参数。

h(θ)=j=0nθjxjJ(θ)=12mi=0m(yihθ(xi))2

批量梯度下降(Batch gradient descent)

现在我们就要求出J(θ)取到极小值时的(θ^T)向量。之前已经说过了,沿着函数梯度的方向下降就能最快的找到极小值。

  1. 计算J(θ)关于(θ^T)的偏导数,也就得到了向量中每一个θ的梯度。
    J(θ)θjamp;=1mi=0m(yihθ(xi))θj(yihθ(xi))amp;=1mi=0m(yihθ(xi))θj(j=0nθjxijyi)amp;=1mi=0m(yihθ(xi))xij
  2. 沿着梯度的方向更新参数θ的值
    θj:=θj+αJ(θ)θj:=θjα1mi=0m(yihθ(xi))xij
  3. 迭代直到收敛。

可以看到,批量梯度下降是用了训练集中的所有样本。因此在数据量很大的时候,每次迭代都要遍历训练集一遍,开销会很大,所以在数据量大的时候,可以采用随机梯度下降法。

随机梯度下降(Stochastic gradient descent)

和批量梯度有所不同的地方在于,每次迭代只选取一个样本的数据,一旦到达最大的迭代次数或是满足预期的精度,就停止。

可以得出随机梯度下降法的θ更新表达式。

θj:=θjα1m(yihθ(xi))xij

迭代直到收敛。

两种迭代思路的python实现

#随机梯度
def stochastic_gradient_descent(x,y,theta,alpha,m,max_iter):
    """批量梯度下降法,每一次梯度下降使用训练集中的所有样本来计算误差。

    :param x: 训练集种的自变量
    :param y: 训练集种的因变量
    :param theta: 待求的权值
    :param alpha: 学习速率
    :param m: 样本总数
    :param max_iter: 最大迭代次数
    """
    deviation = 1
    iter = 0
    while deviation > EPS and iter < max_iter:
        deviation = 0
        sigma1 = 0
        sigma2 = 0
        # 对训练集中的所有数据求和迭代
        for i in range(m):
            h = theta[0] * x[i][0] + theta[1] * x[i][1] # 两个特征变量
            # 对每个特征变量进行进行误差求和
            sigma1 = sigma1 + (y[i] - h)*x[i][0]
            sigma2 = sigma2 + (y[i] - h)*x[i][1]
        # 求出 沿着梯度的方向更新参数θ的值
        theta[0] = theta[0] + alpha * sigma1 / m
        theta[1] = theta[1] + alpha * sigma2 / m
        # 计算误差
        for i in range(m):
            deviation = deviation + (y[i] - (theta[0] * x[i][0] + theta[1] * x[i][1])) ** 2
        iter = iter + 1
    return theta, iter

#批量梯度
def batch_gradient_descent(x,y,theta,alpha,m,max_iter):
    """批量梯度下降法,每一次梯度下降使用训练集中的所有样本来计算误差。

    :param x: 训练集种的自变量
    :param y: 训练集种的因变量
    :param theta: 待求的权值
    :param alpha: 学习速率
    :param m: 样本总数
    :param max_iter: 最大迭代次数
    """
    deviation = 1
    iter = 0
    while deviation > EPS and iter < max_iter:
        deviation = 0
        sigma1 = 0
        sigma2 = 0
        for i in range(m): #对训练集中的所有数据求和迭代
            h = theta[0] * x[i][0] + theta[1] * x[i][1]
            sigma1 = sigma1 +  (y[i] - h)*x[i][0] 
            sigma2 = sigma2 +  (y[i] - h)*x[i][1] 
        theta[0] = theta[0] + alpha * sigma1 /m
        theta[1] = theta[1] + alpha * sigma2 /m
        #计算误差
        for i in range(m):
            deviation = deviation + (y[i] - (theta[0] * x[i][0] + theta[1] * x[i][1])) ** 2
        iter = iter + 1
    return theta, iter

正规方程 Normal Equation


在线性回归中,为了求得参数的最优值,一般采用梯度下降和本文将要介绍的正规方程(normalequation)。相比较梯度下降采用多次迭代逼近的方式,normal equation采用矩阵运算可以直接求解出参数。先介绍下什么是normal equation,假设一个数据集X有m个样本,n个特征。则假设函数为: ,数据集X的特征向量表示为:


表示第i个训练样本,表示第i个训练样本的第j个特征。之所以在X中加了第一列全为1,是为了让

若希望假设函数能够拟合Y,则。又因为  ,所以可以通过矩阵运算求出参数
熟悉线性代数的同学应该知道怎么求出参数,但是前提是矩阵X存在逆矩阵。但只有方阵才有可能存在逆矩阵(不熟悉定理的同学建议去补补线性代数),因此可以通过左乘 使等式变成 ,因此,有同学可能会有疑问不一定存在啊,确实是,但是极少不存在,后面会介绍不存在的处理方法,先别着急。现在你只需要明白为什么就可以了,并且记住。

介绍完normal equation求解参数,我们已经知道了两种求解参数的方法,normal equation和梯度下降,现在来对比下这两种方法的优缺点以及什么场景选择什么方法。具体见下表吧:




回到上面说的不一定存在,这种情况是极少存在的。如果不可逆了,一般要考虑一下两者情况:
(1) 移除冗余特征,一些特征存在线性依赖。
(2) 特征太多时,要删除一些特征。例如(m<n),对于小样本数据使用正则化。



正规方程 Normal Equation


在线性回归中,为了求得参数的最优值,一般采用梯度下降和本文将要介绍的正规方程(normalequation)。相比较梯度下降采用多次迭代逼近的方式,normal equation采用矩阵运算可以直接求解出参数。先介绍下什么是normal equation,假设一个数据集X有m个样本,n个特征。则假设函数为: ,数据集X的特征向量表示为:

猜你喜欢

转载自blog.csdn.net/qecode/article/details/78659830