Python3入门机器学习之4.5梯度下降法的向量化和数据标准化

Python3入门机器学习

4.5 梯度下降法的向量化和数据标准化

1.向量化:
在上一节中,我们推导出求解梯度的公式如下:
Python3入门机器学习之4.5梯度下降法的向量化和数据标准化_第1张图片
继续变形,使其可以向量化,如下:
Python3入门机器学习之4.5梯度下降法的向量化和数据标准化_第2张图片
于是求梯度的函数的实现方式也相应的改变,如下:

 def dJ(theta, X_b, y):
            # res = np.empty(len(theta))
            # res[0] = np.sum(X_b.dot(theta) - y)
            # for i in range(1, len(theta)):
            #     res[i] = (X_b.dot(theta) - y).dot(X_b[:,i])
            # return res * 2 / len(X_b)
            return X_b.T.dot(X_b.dot(theta) - y) * 2. / len(X_b)

下面将梯度下降法并且向量化之后的线性回归模型用在真实数据中:
(1).准备数据,依然为波士顿房价:
Python3入门机器学习之4.5梯度下降法的向量化和数据标准化_第3张图片
(2).使用梯度下降法:
Python3入门机器学习之4.5梯度下降法的向量化和数据标准化_第4张图片
会发现此时会报错,并且参数coef_中都是nan。为什么会overflow呢?原因在于对于真实的数据集,如下:
Python3入门机器学习之4.5梯度下降法的向量化和数据标准化_第5张图片
每一个特征所对应的数据规模是不一样的,面对这样一个数据,我们实际求得的梯度很有可能结果也是非常大的。我们使用默认的eta,最终形成的步长还是太大,使得我们梯度下降法的过程是不收敛的。

为了解决以上的问题,我们可以减小学习率eta的值,但是如果eta太小,导致每一步行进的都非常小,那我们需要用更多的循环次数来找到损失函数的最小值。以下为验证这个结论的过程:
Python3入门机器学习之4.5梯度下降法的向量化和数据标准化_第6张图片
2.数据归一化:
以上可以看到,减小了学习率eta的值,使得循环次数增大,甚至需要更大,这样就会很耗时。为了解决这个问题,我们需要对数据进行归一化处理。
Python3入门机器学习之4.5梯度下降法的向量化和数据标准化_第7张图片
使用梯度下降前进行数据归一化:
Python3入门机器学习之4.5梯度下降法的向量化和数据标准化_第8张图片
所以,当我们使用梯度下降法搜索损失函数的最小值之前,对数据需要进行归一化处理

3.使用梯度下降法的优势:
当矩阵比较大时,由于正规方程法是对矩阵进行运算,相应的会比较耗时;使用梯度下降法就会提高效率:
Python3入门机器学习之4.5梯度下降法的向量化和数据标准化_第9张图片

你可能感兴趣的:(Python3入门机器学习,机器学习,python,人工智能,算法)