批量梯度下降、随机梯度下降、小批量梯度下降

一、批量梯度下降(Batch Gradient Descent,BGD)

  在批量梯度下降中,每次迭代都使用整个训练集的数据进行梯度计算和参数更新。也就是说,每次迭代都对所有的样本求取梯度,然后更新参数。由于要处理整个训练集,批量梯度下降需要较大的内存来存储全部数据,并且计算速度相对较慢。但它的优点是可以保证收敛到全局最优解,尤其在凸优化问题上表现良好。

import numpy as np
 
X = np.random.rand(100, 1)
y = 4 + 3*X + np.random.randn(100, 1)
X_b = np.c_[np.ones((100, 1)), X]

m = len(X_b)
n_iterations = 1000
t0, t1 = 5, 50

def learning_rate_schedule(t):
    return t0/(t1+t)

theta = np.random.randn(2, 1)
for iteration in range(n_iterations):
    gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y)
    eta = learning_rate_schedule(iteration)
    theta = theta - eta*gradients
    
print(theta)

1. 三次运行结果

二、 随机梯度下降(Stochastic Gradient Descent,SGD)

  在随机梯度下降中,每次迭代只使用一个样本进行梯度计算和参数更新。因为每次只看一个样本,随机梯度下降的计算速度很快,但对于非凸优化问题或存在噪声较多的数据集,可能会收敛到局部最优解而不是全局最优解。此外,由于随机性的存在,它可以帮助跳出局部最优解。

import numpy as np
 
X = 2*np.random.rand(100, 1)
y = 4 + 3*X + np.random.randn(100, 1)
X_b = np.c_[np.ones((100, 1)), X]

m = len(X_b)
n_epochs = 1000
t0, t1 = 5, 50
 
def learning_rate_schedule(t):
    return t0/(t1+t)
 
theta = np.random.randn(2, 1)
for epoch in range(n_epochs):
    for i in range(m):
        random_index = np.random.randint(m)
        xi = X_b[random_index:random_index+1]
        yi = y[random_index:random_index+1]
        gradients = 2 * xi.T.dot(xi.dot(theta) - yi)
        eta = learning_rate_schedule(epoch*m + i)
        theta = theta - eta*gradients
 
print(theta)

1. 三次运行结果

三、小批量梯度下降(Mini-batch Gradient Descent,MBGD)

  小批量梯度下降是介于批量梯度下降和随机梯度下降之间的一种方法。它每次迭代使用一个小批量(batch)的样本进行梯度计算和参数更新。这个小批量的大小通常是介于全数据集和单个样本之间的一个中等规模。小批量梯度下降综合了批量梯度下降的稳定性和随机梯度下降的计算效率,通常在实际应用中被广泛采用。

import numpy as np
 
X = 2*np.random.rand(100, 1)
y = 4 + 3*X + np.random.randn(100, 1)
X_b = np.c_[np.ones((100, 1)), X]

m = len(X_b)
batch_size = 10
n_epochs = 1000
t0, t1 = 5, 50
 
def learning_rate_schedule(t):
    return t0/(t1+t)

theta = np.random.randn(2, 1)
for epoch in range(n_epochs):
    shuffled_index = np.random.permutation(m)
    X_b = X_b[shuffled_index]
    y = y[shuffled_index]
    for i in range(0, m, batch_size):
        xi = X_b[i: i+batch_size]
        yi= y[i: i+batch_size]
        gradients = 2/batch_size * xi.T.dot(xi.dot(theta) - yi)
        eta = learning_rate_schedule(epoch*m + i)
        theta = theta - eta*gradients

print(theta)

1. 三次运行结果

四、sklearn—LinearRegression

import numpy as np
from sklearn.linear_model import LinearRegression
 
X = 2*np.random.rand(100, 1)
y = 4 + 3*X + np.random.randn(100, 1)

reg = LinearRegression().fit(X, y)

print(reg.coef_)
print(reg.intercept_)

1. 三次运行结果 


 

相关推荐

  1. 随机梯度下降算法

    2024-02-17 04:02:03       19 阅读
  2. 随机梯度下降(SGD)

    2024-02-17 04:02:03       9 阅读
  3. Python梯度下降算法

    2024-02-17 04:02:03       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-17 04:02:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-17 04:02:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-17 04:02:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-17 04:02:03       20 阅读

热门阅读

  1. Python OpenCV 牛刀小试(练习)

    2024-02-17 04:02:03       30 阅读
  2. 英伟达(NVIDIA)和CUDA

    2024-02-17 04:02:03       34 阅读
  3. 洛谷C++简单题小练习day13—文字处理软件

    2024-02-17 04:02:03       25 阅读
  4. react中render阶段做了什么

    2024-02-17 04:02:03       34 阅读
  5. 作业2.15

    2024-02-17 04:02:03       26 阅读
  6. 开源软件的影响力

    2024-02-17 04:02:03       22 阅读
  7. 洛谷 P2580 于是他错误的点名开始了

    2024-02-17 04:02:03       26 阅读