赞
踩
import numpy as np def fn(x): """ 原始函数 """ return 2 * x ** 2 def dfn(x): """ 导函数 """ return 4 * x def gradient_descent(x0, learning_rate, dfn, epochs): """ 使用梯度下降法求函数的最小值 Parameters: x0 (float): 初始点的位置 learning_rate (float): 学习率 dfn (function): 导函数 epochs (int): 迭代次数 Returns: x_min (float): 最小值点的位置 """ for _ in range(epochs): x0 = x0 - learning_rate * dfn(x0) return x0 # 随机选择一个出生点 x0 = np.random.randint(low=-1000, high=1000, size=1) # 迭代次数 epochs = 1000 # 学习率 learning_rate = 1e-2 # 使用梯度下降法求最小值 x_min = gradient_descent(x0, learning_rate, dfn, epochs) # 输出最小值 print("最小值点的位置:", x_min)
import numpy as np def df_x(x, y, z): """ f 对 x 求偏导 """ return 2 * x def df_y(x, y, z): """ f 对 y 求偏导 """ return 2 * y def df_z(x, y, z): """ f 对 z 求偏导 """ return 2 * z # 随机选择出生点 x0 = np.random.randint(low=-1000, high=1000, size=(1,)) y0 = np.random.randint(low=-1000, high=1000, size=(1,)) z0 = np.random.randint(low=-1000, high=1000, size=(1,)) # 迭代次数 epochs = 1000 # 学习率 learning_rate = 1e-2 for _ in range(epochs): # 求解每个变量的偏导 fx = df_x(x0, y0, z0) fy = df_y(x0, y0, z0) fz = df_z(x0, y0, z0) # 每个变量都减去自己的偏导 x0 = x0 - learning_rate * fx y0 = y0 - learning_rate * fy z0 = z0 - learning_rate * fz # 输出更新后的变量值 print("更新后的 x 值:", x0) print("更新后的 y 值:", y0) print("更新后的 z 值:", z0)
import torch # 定义原始函数和导函数 def fn(x): return 2 * x ** 2 # 说明:pytorch可以通过grad函数求导,所以可以省去写导函数 # def dfn(x): # return 4 * x # 随机选择出生点 # requires_grad=True用来告诉框架该变量是一个张量,需要计算梯度。 x0 = torch.randint(low=-1000, high=1001, size=(1,), dtype=torch.float32, requires_grad=True) # 迭代次数 epochs = 1000 # 学习率 learning_rate = 1e-2 # 使用 PyTorch 进行梯度下降 for _ in range(epochs): # 正向传播计算损失 loss = fn(x0) # 反向传播计算梯度 loss.backward() # 获取梯度并更新参数 with torch.no_grad(): grad = x0.grad x0 -= learning_rate * grad # 梯度清零 x0.grad.zero_() # 输出最小值点的位置 print("最小值点的位置:", x0.item())
import torch def fn(x, y, z): """ 函数定义 """ return x**2 + y**2 + z**2 # 说明:pytorch可以通过grad函数求导,所以可以省去写导函数 # def df_x(x, y, z): # return 2 * x # def df_y(x, y, z): # return 2 * y # def df_z(x, y, z): # return 2 * z # 随机选择出生点 x0 = torch.randint(low=-1000, high=1001, size=(1,), dtype=torch.float32, requires_grad=True) y0 = torch.randint(low=-1000, high=1001, size=(1,), dtype=torch.float32, requires_grad=True) z0 = torch.randint(low=-1000, high=1001, size=(1,), dtype=torch.float32, requires_grad=True) # 迭代次数 epochs = 1000 # 学习率 learning_rate = 1e-2 # 使用 PyTorch 进行梯度下降 for _ in range(epochs): # 正向传播计算损失 loss = fn(x0, y0, z0) # 反向传播计算梯度 loss.backward() # 获取梯度并更新参数 # 在测试阶段或者不需要计算梯度的情况下使用 torch.no_grad() # 以提高计算效率并避免不必要的梯度计算。 with torch.no_grad(): x0 -= learning_rate * x0.grad y0 -= learning_rate * y0.grad z0 -= learning_rate * z0.grad # 梯度清零 x0.grad.zero_() y0.grad.zero_() z0.grad.zero_() # 输出更新后的变量值 print("更新后的 x 值:", x0.item()) print("更新后的 y 值:", y0.item()) print("更新后的 z 值:", z0.item())
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。