""" 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
机器学习常用梯度下降算法对比
于 2022-08-15 22:30:32 首次发布