大数据算法实验三梯度下降

1、实验目的和要求

实验目的:1.理解梯度下降的含义及作用。

  1. 使用python实现梯度下降。
  2. 使用python的3D绘图绘制梯度下降的结果。

实验要求:

书写提交实验报告

2、实验环境

Python3.9

Pycharm2022

Window10

 3、实验内容:

使用gradient_descent()函数和python的Axes3D类绘制梯度下降法求函数f=x^2+y^2的最小值过程的散点图。

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D
# 设置显示中文字体
from plotnine.themes.seaborn_rcmod import mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"]
# 设置正常显示符号
mpl.rcParams["axes.unicode_minus"] = False



def _numerical_gradient_no_batch(f, x):
    h = 1e-4  # 0.0001
    grad = np.zeros_like(x)

    for idx in range(x.size):
        tmp_val = x[idx]
        x[idx] = float(tmp_val) + h
        fxh1 = f(x)  # f(x+h)
        x[idx] = tmp_val - h
        fxh2 = f(x)  # f(x-h)
        grad[idx] = (fxh1 - fxh2) / (2 * h)
        x[idx] = tmp_val  # 还原值
    return grad

#求梯度
def numerical_gradient(f, X):
    if X.ndim == 1:
        return _numerical_gradient_no_batch(f, X)
    else:
        grad = np.zeros_like(X)
        for idx, x in enumerate(X):
            grad[idx] = _numerical_gradient_no_batch(f, x)
        return grad

def f(x,y):
    return(1.0*x**2 + 1.0*y**2 )

#求最小值
def gradient_descent(f, init_x, lr=0.01, step_num=100):
    x = init_x
    x_history = []
    for i in range(step_num):
        x_history.append( x.copy() )
        grad = numerical_gradient(f, x)
        x -= lr * grad
    return x, np.array(x_history)

def function(x):
    return x[0]**2 + x[1]**2


init_x = np.array([3.0, -4.0])
lr = 0.1
step_num = 20
x0, x_history,= gradient_descent(function, init_x, lr=lr, step_num=step_num)
print(x0)

#定义坐标轴
fig = plt.figure()
ax = Axes3D(fig)
#ax = plt.axes(projection='3d')

#设置x、y、z轴
x= np.arange(-3, 3, 1)  # 为了绘制函数的原图像
y= np.arange(-4, 4, 1)
x,y= np.meshgrid(x,y)      #空间的点序列转换成网格点
#plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
#设定显示范围
ax.set_xlabel('x0')
ax.set_ylabel('x1')
ax.set_zlabel('z')


plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']    #汉显
#plt.title("显示图像")
#ax.set_title('函数图像')
ax.text2D(0.5, 0.95, "函数图像", transform=ax.transAxes)
ax.set_xlim(-3, 3)
ax.set_ylim(-4, 4)
ax.set_zlim(0, 25)



#生成三维数据
x1=x_history[:,0]
x2=x_history[:,1]
z0=f(x1,x2)
#绘制极值点散点图
ax.scatter(x1, x2, z0, cmap='spectral', c='r', label='airplane') # 绘制已经找到的极值点
#ax.legend()  # 使坐标系为网格状
plt.show()  # 显示



'''
def gradient_descent(f, init_x, lr=0.01, step_num=100):
    x0 = init_x
    x1 = init_x
    y0 = init_y
    y1 = init_y
    x_history = []
    y_history = []
    z_history = []
    for i in range(step_num):
        x_history.append(x1.copy())
        y_history.append(y1.copy())
        z_history.append(f(x1,x2))
        # 计算梯度
        gradx = numerical_gradient(f, x0)
        grady = numerical_gradient(f, y0)
        x1 -= lr * gradx
        y1 -= lr * grady
        # 为新一轮迭代做准备
        x0 = x1
        y0 = y1
        z0 = f(x0, y0)
    return x, np.array(x_history),np.array(y_history)
'''

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值