机器学习&全栈我爱编程

python机器学习之3D Matplotlib绘图

2018-05-05  本文已影响304人  采香行处蹙连钱
参考文献:
  1. python 3D绘图: https://morvanzhou.github.io/tutorials/data-manipulation/plt/3-5-3d/
  2. 一步看效果:https://blog.csdn.net/baoyan2015/article/details/52805349
  3. 进阶:https://blog.csdn.net/Eddy_zheng/article/details/48713449
  4. 效果: 屏幕快照 2018-05-05 下午3.02.10.png
初衷

最近在读《白话深度学习与TensorFlow》,决定撸一把 “神经网络深度学习” 知识。全栈之路上,必须占领人工智能这个技术高地。

读完前三章,至少掌握了基本的概念:如机器学习、深度学习、神经网络深度学习、梯度下降法、反向传播等基础概念,原理方面也非常通俗易懂。利用有限的学习时间,占领深度学习这个技术高地。

看到梯度下降法时,有一个Loss损失函数 :

屏幕快照 2018-05-05 下午3.24.57.png
然后函数是显示在一个三维空间上的,特别想把这个函数的三维图片展示出来,于是有了写这篇小文章的初衷。
学习matplotlib
  1. 绘制三维散点图和简单四面体

    
    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()
    

    效果如下:


    屏幕快照 2018-05-05 下午3.05.53.png
屏幕快照 2018-05-05 下午3.06.57.png
  1. 绘制三维曲面和三维散点图

    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()
    

    最终效果如下:


    屏幕快照 2018-05-05 下午3.08.48.png
屏幕快照 2018-05-05 下午3.13.48.png
  1. 绘制二维函数

    参考文献:http://www.cnblogs.com/sheeva/p/5780784.html

    此处绘制的二维函数是

    image
    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()  #绘制图像
    
  2. 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()

效果如下:


小结
上一篇下一篇

猜你喜欢

热点阅读