机器学习常用梯度下降算法对比

"""
   SGD代码步骤:
             1.确定优化函数
             2.确定theta参数
             3.初始化参数
             4.根据梯度公式(theta_new = theta_old - alpha * J'(theta))
             5.一直迭代,不断更新求解的theta的近似向量,直到满足迭代停止条件,
"""
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.pylab as mpl
from mpl_toolkits.mplot3d import Axes3D

# 设置字符集,防止中文乱码
mpl.rcParams['font.sans-serif'] = [u'simHei']
mpl.rcParams['axes.unicode_minus'] = False

# 第一步:准备训练的数据集和一些初始化参数配置; 例子:假设训练学习y = 2.33 * x
NUM = 100  ## 训练样本总数100
epoch = 150 ## 迭代总数
min_batch = 10 ## 训练集大小
LR = 0.0001 ## 学习率
X_input = np.arange(NUM) * 0.1  ## 生成输入的X数据(样本)
Y_ture = 5 * X_input   ## 生成训练的Y数据

# # 初始化的theta的值
# K = 0.0
# # 记录每次更新的theta的列表,方便后续画图
# k_record = [0.0]

# 确定近似函数J(theta), 构造训练函数
def train_fun(X, K):
    res = K * X
    return res

"""
   BGD(梯度下降算法代码):遍历所有样本求和,得到每一次theta的值
"""
# 初始化的theta的值
K_BGD = 0
# 记录每次更新的梯度值的列表,方便后续画图
K_BGD_RECORD = [0.0]

for steps in range(epoch):
    # 设置一个变量存储所有样本求和后的预测函数值
    SUM_BGD = 0
    for index in range(len(X_input)):
        # 所有样本求和后的预测函数值与对应样本的真实Y值的差值==J(theta)(误差损失)== 梯度
        SUM_BGD += (train_fun(X_input[index], K_BGD) - Y_ture[index]) * X_input[index]
    # 更新theta_new = 学习率 * 误差
    # 梯度值==之前theta-最新theta
    K_BGD -= LR * SUM_BGD
    # 记录每次更新的梯度值
    K_BGD_RECORD.append(K_BGD)
# 输出记录的梯度值
print(K_BGD_RECORD)

"""
   SGD的特点(梯度下降算法代码):单个样本更新一次梯度
"""
# 初始化的theta的值
K_SGD = 0.0
# 记录每次更新的梯度值的列表,方便后续画图
K_SGD_RECORD = [0.0]

for step in range(epoch):
    index = np.random.randint(len(X_input))
    SGD = (train_fun(X_input[index], K_SGD) - Y_ture[index]) * X_input[index]
    # 更新theta_new = 学习率 * 误差
    # 梯度值==之前theta-最新theta
    K_SGD -= LR * SGD
    # 记录每次更新的梯度值
    K_SGD_RECORD.append(K_SGD)
# 输出记录的梯度值
print(K_SGD_RECORD)

"""
   MBGD的特点(梯度下降算法代码):批量样本更新一次梯度
"""
# 初始化的theta的值
K_MBGD = 0
# 批量记录更新的梯度值的列表,方便后续画图
K_MBGD_RECORD = [0.0]

for step in range(epoch):
    SUM_MBGD = 0
    index_start = np.random.randint(len(X_input) - min_batch)
    for index in np.arange(index_start, index_start+m
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值