基于Scikit-learn的机器学习基本算法(二)梯度下降

梯度下降是除了线性回归的另一个线性模型拟合算法。核心思想是由随机值开始,不断的重复迭代,在每一次迭代中,在使成本函数降低最大的方向上前进一步,以不断的逼近最小值。
梯度下降算法的重要参数:

  • 学习率 eta: 决定了每一步的梯度下降步长,学习率过高时,有可能出现结果不收敛的情况,学习率过低时,无法得到最优值。

梯度下降分为批量梯度下降和随机梯度下降。

批量梯度下降

根据数学推导,可通过代码直接实现。

X_b = np.c_[np.ones((100, 1)), X]

eta = 0.1 #learning rate
n_iterations = 1000
m = 100

theta = np.random.randn(2, 1) #random initialization

for iteration in range(n_iterations):
    gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y)
    theta = theta - eta * gradients
    
print(theta)

[[4.02040005]
[3.04161372]]

可以发现,与线性回归标准公式得到的结果完全一致。这种算法由于每次迭代都对样本进行全量的计算,所以在样本数量很多时会变得很慢。但梯度下降对处理多特征的情况具有效率上的优势。

学习率与梯度下降

我们来看看前10次迭代时不同学习率的效果。

X_b = np.c_[np.ones((100, 1)), X]
plt.plot(X, y, "b.")
X_new = np.array([[0], [2]])
X_new_b = np.c_[np.ones((2, 1)), X_new]

eta = 0.5 #learning rate
n_iterations = 10
m = 100
theta = np.random.randn(2, 1) #random initialization

for iteration in range(n_iterations):
    gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y)
    theta = theta - eta * gradients
    y_predict = X_new_b.dot(theta)
    plt.plot(X_new, y_predict, "r-")
学习率0.02
学习率0.1
学习率0.5

可以看到学习率过低时,收敛速度很慢,学习率过高时,直接越过了最优解而无法收敛。

随机梯度下降

随机梯度下降与批量梯度下降最大的区别在于,每次迭代只选择一个样本来优化参数。这样可以弥补批量梯度下降在样本数过高时计算代价过大的缺点,当成本函数非常不规则时,随机梯度下降可以逃离局部最优,但缺点是它永远定位不到最优解,只能获得近似最优解。
scikit-learning库中有随机梯度下降的相应函数。

from sklearn.linear_model import SGDRegressor

sgd_reg = SGDRegressor(max_iter = 100, eta0 = 0.1)
sgd_reg.fit(X, y.ravel())
sgd_reg.intercept_, sgd_reg.coef_

(array([3.99629727]), array([3.01429477]))

本节需要记忆的语法:

1. np.ones() #创建所有取值都为1的数组
2. np.c_[] #将数组衔接为矩阵
3. a.dot(b) #求矩阵内积
4. sgd_reg = SGDRegressor(max_iter = 100, eta0 = 0.1) #创建一个SGD回归模型
5. sgd_reg.fit(X, y.ravel()) #模型参数拟合

你可能感兴趣的:(基于Scikit-learn的机器学习基本算法(二)梯度下降)