相关概念:

1.x向量和y向量

import numpy as np
import matplotlib.pyplot as plt
x = np.array([[0,1,2,3],
[0,0,0,0],
[0,0,0,0],
[0,0,0,0]])
y = np.array([[0,0,0,0],
[1,0,0,0],
[2,0,0,0],
[3,0,0,0]])
plt.plot(x,y,
color = 'red', ##全部点设置红色
marker='o', ##形状:实心圆圈
linestyle = '') ##线性:空 点与点间不连线
plt.grid(True) ##显示网格
plt.show()

x向量和y向量

x向量:[0, 1, 2, 3]
y向量:[0, 1, 2, 3]

2.xv和yv矩阵

import numpy as np
import matplotlib.pyplot as plt
x = [0,1,2,3]
y = [0,1,2,3]
print(x)
print(y)
x,y = np.meshgrid(x,y)
print(x)
print(y)
plt.plot(x,y,
color = 'red', ##全部点设置红色
marker='o', ##形状:实心圆圈
linestyle = '') ##线性:空 点与点间不连线
plt.grid(True) ##显示网格
plt.show()

xv和yv坐标矩阵

xv坐标矩阵:

[[0 1 2 3]
 [0 1 2 3]
 [0 1 2 3]
 [0 1 2 3]]

yv坐标矩阵:

[[0 0 0 0]
 [1 1 1 1]
 [2 2 2 2]
 [3 3 3 3]]

z:网格平面坐标

图片来源:https://www.cnblogs.com/lantingg/p/9082333.html

import numpy as np
import matplotlib.pyplot as plt
#调用meshgrid实现以上功能
x = np.linspace(0,100,11)
y = np.linspace(0,50,11)
print(x)
print(y)
x,y = np.meshgrid(x,y)
print('x--meshgrid后的数据',x)
print('y--meshgrid后的数据',y)
plt.plot(x,y,
color = 'red', ##全部点设置红色
marker='o', ##形状:实心圆圈
linestyle = '') ##线性:空 点与点间不连线
plt.grid(True) ##显示网格
plt.show()
'''
x = [ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.]
y = [ 0. 5. 10. 15. 20. 25. 30. 35. 40. 45. 50.]
x--meshgrid后的数据 [将x一维数组,重复11次]
[[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.]
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.]
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.]
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.]
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.]
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.]
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.]
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.]
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.]
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.]
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.]]
y--meshgrid后的数据 [将y一位数组转置成列,再重复11次]
[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5.]
[10. 10. 10. 10. 10. 10. 10. 10. 10. 10. 10.]
[15. 15. 15. 15. 15. 15. 15. 15. 15. 15. 15.]
[20. 20. 20. 20. 20. 20. 20. 20. 20. 20. 20.]
[25. 25. 25. 25. 25. 25. 25. 25. 25. 25. 25.]
[30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30.]
[35. 35. 35. 35. 35. 35. 35. 35. 35. 35. 35.]
[40. 40. 40. 40. 40. 40. 40. 40. 40. 40. 40.]
[45. 45. 45. 45. 45. 45. 45. 45. 45. 45. 45.]
[50. 50. 50. 50. 50. 50. 50. 50. 50. 50. 50.]]
'''

实例

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def plot_3d():
fig = plt.figure(figsize=(12,8))
ax = Axes3D(fig)
x = np.arange(-2,2,0.05)
y = np.arange(-2,2,0.05)
##对x,y数据执行网格化
x,y = np.meshgrid(x,y)
z1 = np.exp(-x**2-y**2)
z2 = np.exp(-(x-1)**2-(y-1)**2)
z = -(z1-z2)*2
ax.plot_surface(x,y,z, ##x,y,z二维矩阵(坐标矩阵xv,yv,zv)
rstride=1,##retride(row)指定行的跨度
cstride=1,##retride(column)指定列的跨度
cmap='rainbow') ##设置颜色映射
##设置z轴范围
ax.set_zlim(-2,2)
##设置标题
plt.title('优化设计之梯度下降--目标函数',fontproperties = 'SimHei',fontsize = 20)
plt.show()
ax.plot_surface()
plot_3d()

axes3d.plot_surface

 

def plot_axes3d_wireframe():
fig = plt.figure(figsize=(12,8))
ax = Axes3D(fig)
x = np.arange(-2,2,0.05)
y = np.arange(-2,2,0.05)
##对x,y数据执行网格化
x,y = np.meshgrid(x,y)
z1 = np.exp(-x**2-y**2)
z2 = np.exp(-(x-1)**2-(y-1)**2)
z = -(z1-z2)*2
ax.plot_wireframe(x,y,z, ##x,y,z二维矩阵(坐标矩阵xv,yv,zv)
rstride=1,##retride(row)指定行的跨度
cstride=1,##retride(column)指定列的跨度
cmap='rainbow') ##设置颜色映射
##设置z轴范围
ax.set_zlim(-2,2)
##设置标题
plt.title('优化设计之梯度下降--目标函数',fontproperties = 'SimHei',fontsize = 20)
plt.show()
plot_axes3d_wireframe()

wireframe网格图

###二维散点图

##二维散点图
'''
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None,
vmin=None, vmax=None, alpha=None, linewidths=None,
verts=None, edgecolors=None, hold=None, data=None,
**kwargs) x,y 平面点位置
s控制节点大小
c对应颜色值,c=x使点的颜色根据点的x值变化
cmap:颜色映射
marker:控制节点形状
alpha:控制节点透明度
''' import numpy as np
import matplotlib.pyplot as plt ##二维散点图
fig = plt.figure()
x = np.arange(100)
y = np.random.randn(100)
plt.scatter(x,y,c='b')
plt.scatter(x+4,y,c='b',alpha=0.5)
plt.show()

二维散点图

##三维散点图
'''
p3d.Axes3D.scatter( xs, ys, zs=0, zdir=’z’, s=20, c=None, depthshade=True,
*args, **kwargs ) p3d.Axes3D.scatter3D( xs, ys, zs=0, zdir=’z’, s=20, c=None, depthshade=True,
*args, **kwargs)
xs,ys 代表点x,y轴坐标
zs代表z轴坐标:第一种,标量z=0 在空间平面z=0画图,第二种z与xs,yx同样shape的数组
'''
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D fig = plt.figure()
ax = Axes3D(fig)
x = np.arange(100)
y = np.random.randn(100)
ax.scatter(x,y,c='b',s=10,alpha=0.5) ##默认z=0平面
ax.scatter(x+4,y,c='b',s=10,alpha=0.7)
ax.scatter(x+4,y,2,c='b',s=10,alpha=0.7) ##指定z=2平面
plt.show()

z轴标量

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D fig = plt.figure()
ax = Axes3D(fig)
z = 6*np.random.randn(5000)
x = np.sin(z)
y = np.cos(z)
ax.scatter(x,y,z,c='b',s=10,alpha=0.5)
plt.show()

z轴与x,y同样shape

'''二维梯度下降法'''
def func_2d_single(x,y):
'''
目标函数传入x,y
:param x,y: 自变量,一维向量
:return: 因变量,标量
'''
z1 = np.exp(-x**2-y**2)
z2 = np.exp(-(x-1)**2-(y-1)**2)
z = -(z1-2*z2)*0.5
return z def func_2d(xy):
'''
目标函数传入xy组成的数组,如[x1,y1]
:param xy: 自变量,二维向量 (x,y)
:return: 因变量,标量
'''
z1 = np.exp(-xy[0]**2-xy[1]**2)
z2 = np.exp(-(xy[0]-1)**2-(xy[1]-1)**2)
z = -(z1-2*z2)*0.5
return z
def grad_2d(xy):
'''
目标函数的梯度
:param xy: 自变量,二维向量
:return: 因变量,二维向量 (分别求偏导数,组成数组返回)
'''
grad_x = 2*xy[0]*(np.exp(-(xy[0]**2+xy[1]**2)))
grad_y = 2*xy[1]*(np.exp(-(xy[0]**2+xy[1]**2)))
return np.array([grad_x,grad_y])
def gradient_descent_2d(grad, cur_xy=np.array([1, 1]), learning_rate=0.001, precision=0.001, max_iters=100000000):
'''
二维目标函数的梯度下降法
:param grad: 目标函数的梯度
:param cur_xy: 当前的x和y值
:param learning_rate: 学习率
:param precision: 收敛精度
:param max_iters: 最大迭代次数
:return: 返回极小值
'''
print(f"{cur_xy} 作为初始值开始的迭代......")
x_cur_list = []
y_cur_list = []
for i in tqdm(range(max_iters)):
grad_cur = grad(cur_xy)
##创建两个列表,用于接收变化的x,y
x_cur_list.append(cur_xy[0])
y_cur_list.append(cur_xy[1])
if np.linalg.norm(grad_cur,ord=2)<precision: ##求范数,ord=2 平方和开根
break ###当梯度接近于0时,视为收敛
cur_xy = cur_xy-grad_cur*learning_rate
x_cur_list.append(cur_xy[0])
y_cur_list.append(cur_xy[1])
print('第%s次迭代:x,y = %s'%(i,cur_xy))
print('极小值 x,y = %s '%cur_xy)
return (x_cur_list,y_cur_list)
if __name__=="__main__":
current_xy_list = gradient_descent_2d(grad_2d)
fig = plt.figure(figsize=(12,8))
ax = Axes3D(fig)
a = np.array(current_xy_list[0])
b = np.array(current_xy_list[1])
c = func_2d_single(a,b)
ax.scatter(a,b,c,c='Black',s=10,alpha=1,marker='o')
x = np.arange(-2,2,0.05)
y = np.arange(-2,2,0.05)
##对x,y数据执行网格化
x,y = np.meshgrid(x,y)
z = func_2d_single(x,y)
ax.plot_surface(x,y,z,
rstride=1,##retride(row)指定行的跨度
cstride=1,##retride(column)指定列的跨度
cmap='rainbow',
alpha=0.3
) ##设置颜色映射
# ax.plot_wireframe(x,y,z,)
##设置z轴范围
ax.set_zlim(-2,2)
##设置标题
plt.title('汽车优化设计之梯度下降--二元函数',fontproperties = 'SimHei',fontsize = 20)
plt.xlabel('x',fontproperties = 'SimHei',fontsize = 20)
plt.ylabel('y', fontproperties='SimHei', fontsize=20)
plt.show()

梯度下降法及下降路径

numpy.meshgrid的理解以及3D曲面图绘制(梯度下降法实现过程)的更多相关文章

  1. python 绘图---2D、3D散点图、折线图、曲面图

    python中绘制2D曲线图需要使用到Matplotlib,Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形,通过 Matplo ...

  2. tecplot 把散点绘成曲面图【转载】

    转载自:http://blog.sina.com.cn/s/blog_a319f5ff0101q6s8.html 找了好久,终于自己研究出来,如何使用tecplot绘制曲面图了 第一步:数据的整理 如 ...

  3. Python的可视化包 – Matplotlib 2D图表(点图和线图,.柱状或饼状类型的图),3D图表(曲面图,散点图和柱状图)

    Python的可视化包 – Matplotlib Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型地2D图表和一些基本的3D图表.Matplotlib最早是为了可 ...

  4. numpy.meshgrid()理解

    本文的目的是记录meshgrid()的理解过程: step1. 通过一个示例引入创建网格点矩阵; step2. 基于步骤1,说明meshgrid()的作用; step3. 详细解读meshgrid() ...

  5. 对numpy.meshgrid()理解

    一句话解释numpy.meshgrid()——生成网格点坐标矩阵.关键词:网格点,坐标矩阵 网格点是什么?坐标矩阵又是什么鬼?看个图就明白了: 图中,每个交叉点都是网格点,描述这些网格点的坐标的矩阵, ...

  6. matplotlib点线 坐标刻度 3D图绘制(六)

    plot语句中支持除X,Y以外的参数,以字符串形式存在,来控制颜色.线型.点型等要素,语法形式为: plt.plot(X, Y, 'format', ...) 1 点和线的样式 颜色 参数color或 ...

  7. 【python】pandas & matplotlib 数据处理 绘制曲面图

    Python matplotlib模块,是扩展的MATLAB的一个绘图工具库,它可以绘制各种图形 建议安装 Anaconda后使用 ,集成了很多第三库,基本满足大家的需求,下载地址,对应选择pytho ...

  8. numpy.meshgrid()

    numpy提供的numpy.meshgrid()函数可以让我们快速生成坐标矩阵X,Y 语法:X,Y = numpy.meshgrid(x, y)输入:x,y,就是网格点的横纵坐标列向量(非矩阵)输出: ...

  9. numpy meshgrid 和 mgrid 的两个简单实例和解析

    numpy.meshgrid 和 numpy.mgrid 用于返回包含坐标向量的坐标矩阵. 当坐标矩阵为二维时, 可用于在图像变形时构建网格. 实例一 from __future__ import p ...

随机推荐

  1. Python2和Python3中的rang()不同之点

    知道在python中rang()是一个有序的列表,在使用过程发现,Python2和Python3中的rang()不同之点,下面讲述不同之点 1,Python2 rang()用法 ->> r ...

  2. LeetCode107. 二叉树的层次遍历 II

    107. 二叉树的层次遍历 II 描述 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 示例 例如,给定二叉树: [3,9,20,null ...

  3. VS2015-MFC基础教程-应用程序工程中文件的组成结构

    VS2015应用程序向导生成框架程序后,我们可以在之前设置的Location下看到此文件夹中包含了几个文件和一个以工程名命名的子文件夹,这个子文件夹中又包含了若干个文件和一个res文件夹,创建工程时的 ...

  4. java并发学习--第二章 spring boot实现线程的创建

    除了之前介绍的创建线程方式外,spring boot为我们了提供一套完整的线程创建方式,其中包括了:线程.线程池.线程的监控. 一.使用spring boot提供的方法创建线程与线程池 1.首先在sp ...

  5. [web 安全] 源码泄露

    web 源码泄露 1..hg 源码泄露 http://www.example.com/.hg/ 2..git 源码泄露 http://www.example.com/.git/config 3..ds ...

  6. ThreadLocal 应用

    利用threadLocal 把拦截器中的对象传递到controller或service中 1.可以用 request 携带数据. 2.更优雅的方式是用threadlocal. 请求进入tomcat 和 ...

  7. 前端每日实战:98# 视频演示如何用纯 CSS 创作一只愤怒小鸟中的绿猪

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/VBGWqX 可交互视频 此视频是可 ...

  8. hdu 6127 : Hard challenge (2017 多校第七场 1008)(计算几何)

    题目链接 题意:二维平面上有n个点(没有重叠,都不在原点,任意两点连线不过原点),每个点有一个权值,用一条过原点的直线把他们划分成两部分,使两部分的权值和的乘积最大.输出最大的乘积. 极角排序后,将原 ...

  9. 对async 函数的研究

    async 函数 1.ES2017 标准引入了 async 函数,使得异步操作变得更加方便. async 函数是什么?一句话,它就是 Generator 函数的语法糖. 前文有一个 Generator ...

  10. Redirecting to /bin/systemctl restart mysql. service Failed to restart mysql.service: Unit not found.

    使用如下命令操作mysql即可: systemctl restart mysqld.service systemctl start mysqld.service systemctl stop mysq ...