梯度下降算法

    技术2023-06-18  84

    一维梯度下降

    import numpy as np import matplotlib.pyplot as plt # 定义原始函数方程 def f(x): return x**2+5*x+4 # 求导方程,用导数定义式求导 f'(x) =( f(x+Δx) - f(x) ) / Δx def gradient(x): delat = 1e-4 # 定义很小的数 1*10^-4 return (f(x+delat)-f(x))/delat # 梯度下降的起始值theta theta = 10 # 依次保存每次调整的的z值 x_theta = [] # 学习率alpha alpha = 0.1 # 进行迭代,当导数足够小时停下来 while abs(gradient(theta)) > 0.001: # 保存每次调整的值 x_theta.append(theta) # 根据梯度值来调整theta theta = theta - alpha * gradient(theta) # 绘出更新的轨迹 plt.figure(num=1) # 绘制函数曲线 plot_x = np.linspace(-15, 15, 1000) plot_y = f(plot_x) plt.plot(plot_x, plot_y) # 绘制梯度下降散点图 x_theta = np.array(x_theta) # 将python list转为numpy array y_theta = f(x_theta) plt.scatter(x_theta, y_theta, s=30, c='red', alpha=0.6) plt.show()

    二维梯度下降算法

    import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np # 参数x为向量 包含 x[0] x[1] 两个未知数 def f(x): return 0.2 * (x[0] + x[1]) ** 2 - 0.3 * x[0] * x[1] + 0.4 # 计算梯度 适用于多个未知数的情况 x为向量 def gradient(x): delat = 1e-4 # 定义一个极小值 temp_f = f(x) grad = np.zeros_like(x) for idex in range(x.size): tem_val = x[idex] # 先记下原始值 x[idex] = tem_val + delat f_delat = f(x) - temp_f # 计算 Δf grad[idex] = f_delat / delat x[idex] = tem_val # 算完一个未知数的偏导 把该未知数还原为原先值 return grad # 梯度下降的起始值 x = np.array([10, 13]) # 依次保存每次调整的的值 类型为list x_theta = [] y_theta = [] # 学习率alpha alpha = 0.1 # 迭代次数 num = 0 step_num = 1000 # 判断停止迭代的条件 def is_iterate(x): temp = gradient(x) if(temp[0]**2 + temp[1]**2 >= 0.001): return True else: return False # 迭代 while num <= step_num: x_theta.append(x) y_theta.append(f(x)) grad = gradient(x) x = x - alpha * grad num += 1 # 梯度下降轨迹 将list转换为 np。array格式 x_theta = np.array(x_theta) y_theta = np.array(y_theta) # 绘图 x1 = np.linspace(-15, 15, 500) x2 = np.linspace(-15, 15, 500) X, Y = np.meshgrid(x1, x2) # 填充底面网格 为500*500 # 函数3D图 fig = plt.figure(num=1) ax = Axes3D(fig) ax.plot_surface(X, Y, f([X, Y]), rstride=1, cstride=1, cmap=plt.get_cmap('rainbow')) # 函数3D图 ax.plot(x_theta[:, 0], x_theta[:, 1], y_theta, 'bo--') # 绘制梯度下降的移动轨迹。 # 等高线图 plt.figure(num=2) # plt.contourf(X, Y, f([X, Y]), 25) C = plt.contour(X, Y, f([X, Y]), 25, linewidths=1,colors='k') # 等高线图 plt.scatter(x_theta[:, 0], x_theta[:, 1], s=5, c="r",alpha=0.5) # 在等高线上绘制梯度下降的移动轨迹。 plt.colorbar(C) plt.title("函数等高线图及梯度下降路径") plt.show()

    Processed: 0.039, SQL: 9