参考文献:
- python 3D绘图: https://morvanzhou.github.io/tutorials/data-manipulation/plt/3-5-3d/
- 一步看效果:https://blog.csdn.net/baoyan2015/article/details/52805349
- 进阶:https://blog.csdn.net/Eddy_zheng/article/details/48713449
-
效果:
初衷
最近在读《白话深度学习与TensorFlow》,决定撸一把 “神经网络深度学习” 知识。全栈之路上,必须占领人工智能这个技术高地。
读完前三章,至少掌握了基本的概念:如机器学习、深度学习、神经网络深度学习、梯度下降法、反向传播等基础概念,原理方面也非常通俗易懂。利用有限的学习时间,占领深度学习这个技术高地。
看到
梯度下降法
时,有一个Loss损失函数 :
然后函数是显示在一个三维空间上的,特别想把这个函数的三维图片展示出来,于是有了写这篇小文章的初衷。
学习matplotlib
绘制三维散点图和简单四面体
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np # 简单Demo fig = plt.figure() ax = fig.add_subplot(111, projection='3d') (这种方法是通过X,Y和Z构建一个矩阵,XYZ各取一个点,这里有四个点) X = [1, 1, 2, 2] Y = [3, 4, 4, 3] Z = [1, 2, 1, 1] # 绘制曲面 (四个点可以确定一个四面体) ax.plot_trisurf(X, Y, Z) # 绘制散点图 ax.scatter(X, Y, Z) plt.show()
效果如下:
绘制三维曲面和三维散点图
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np fig = plt.figure() ax = Axes3D(fig) X = np.arange(-4, 4, 0.25) #此处生成一维数组,也可以叫numpy向量,具体格式为 [[-4. -3.75 -3.5 ... 3.25 3.5 3.75] [-4. -3.75 -3.5 ... 3.25 3.5 3.75] [-4. -3.75 -3.5 ... 3.25 3.5 3.75] ... [-4. -3.75 -3.5 ... 3.25 3.5 3.75] [-4. -3.75 -3.5 ... 3.25 3.5 3.75] [-4. -3.75 -3.5 ... 3.25 3.5 3.75]] 这是由X生成的一维数组,同理Y也生成了这样的数组 Y = np.arange(-4, 4, 0.25) #X ,Y合并生成numpy对象,此处相当于合并生成(X,Y) 数组,用于Z (这里是我猜测的) X, Y = np.meshgrid(X, Y) R = np.sqrt(X**2 + Y**2) #生成Z对象,调用numpy的sin函数 Z = np.sin(R) # 具体函数方法可用 help(function) 查看,如:help(ax.plot_surface) ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow') plt.show() #Demo 2 绘制三维三点图 # 绘制三维三点图 data = np.random.randint(0, 255, size=[40, 40, 40]) x, y, z = data[0], data[1], data[2] ax = plt.subplot(111, projection='3d') # 创建一个三维的绘图工程 # 将数据点分成三部分画,在颜色上有区分度 ax.scatter(x[:10], y[:10], z[:10], c='y') # 绘制数据点 ax.scatter(x[10:20], y[10:20], z[10:20], c='r') ax.scatter(x[30:40], y[30:40], z[30:40], c='g') ax.set_zlabel('Z') # 坐标轴 ax.set_ylabel('Y') ax.set_xlabel('X') plt.show()
最终效果如下:
绘制二维函数
参考文献:http://www.cnblogs.com/sheeva/p/5780784.html
此处绘制的二维函数是
import numpy as np import matplotlib.pyplot as plt x=np.linspace(-5,5,1000) #这个表示在-5到5之间生成1000个x值 y=[1/(1+np.exp(-i)) for i in x] #对上述生成的1000个数循环用sigmoid公式求对应的y plt.plot(x,y) #用上述生成的1000个xy值对生成1000个点 plt.show() #绘制图像
over
实践与实现
我们的目的是绘制函数:
梯度下降法
,Loss损失函数 :
fig = plt.figure() ax = Axes3D(fig) X = np.arange(-10, 10, 0.04) Y = np.arange(-10, 10, 0.04) X, Y = np.meshgrid(X, Y) #必须加上这段代码 Z = (X**2 + Y**2 + X*Y + X + Y + 1) # 具体函数方法可用 help(function) 查看,如:help(ax.plot_surface) ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow') plt.show()
效果如下: