用Python动手学机器学习读书笔记(二)

第三章 数据可视化

一.绘制二维图形

3.1.1 绘制随机图形

注:使用matplotlab的pyplot库绘制图形,plot:绘制。matrix:矩阵。
注:seed( ) 函数:用于指定随机数生成时所用算法开始的整数值。为了方便复现。
1.如果使用相同的seed( )值,则每次生成的随即数都相同;不能看成一个序列,是随机的,但是相同的随机数的值相同。
2.如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。
3.设置的seed()值仅一次有效,是全局函数,后面也不变。
4.矩阵中为np.random.seed(x)
例1:

import numpy as np
num=0
while(num<5):
    np.random.seed(5)
    print(np.random.randn())    #np.random.randn()为生成一组随机数满足正态分布,()内为维度结构。空为1个,x为x个一行。
                                #np.random.rand()为生成一组随机数在[0,1)之间,()()内为维度结构。空为1个,x为x个一行。
    num+=1

0.44122748688504143
0.44122748688504143
0.44122748688504143
0.44122748688504143
0.44122748688504143

例2

np.random.seed(3)
a= np.random.randn()
b= np.random.randn()
c=np.random.randn()
print(a)
print(b)
print(c)

1.7886284734303186
0.43650985051198943
0.09649746807200862

例3

np.random.seed(3)
a= np.random.randn()
np.random.seed(10)
b= np.random.randn()
print(a)
print(b)

1.7886284734303186
1.331586504129518

作图:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline        
#在Jupyter中显示图形

x=np.arange(10)       # 生成从0开始向量数组[0,1,2,3,4,5,6,7,8,9]
np.random.seed(10)    # 使每次产生的随机数相同     
y=np.random.randn(10)  # 生成元素为0-1的随机矩阵,八位有效数字。

print(x)
print(y)
plt.plot(x,y)   #创建图形,绘制线条,该线条过x,y对应的点。
plt.show()      #显示当前图形

[0 1 2 3 4 5 6 7 8 9]
[ 1.3315865 0.71527897 -1.54540029 -0.00838385 0.62133597 -0.72008556
0.26551159 0.10854853 0.00429143 -0.17460021]

3.1.2 代码清单的格式

3.1.3 绘制三次函数

例:绘制三次函数f(x)=(x-2)x(x+2)

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

def f(x):
    return (x-2)*x*(x+2)
    
print(f(1))
print(f(np.array([1,2,3])))    #注:当x为ndarray数组时,程序会一次性以ndarray类型返回各个元素对应的f。

-3
[-3 0 15]

3.1.4 确定绘制范围

1.np.arange(a,b,n)函数

x=np.arange(-3,3.4,0.5)   # 左闭右开
print(x)

[-3. -2.5 -2. -1.5 -1. -0.5 0. 0.5 1. 1.5 2. 2.5 3. ]

2.np.linspace(a,b,n)

x=np.linspace(-3,3,10)
print(np.round(x,2))

[-3. -2.33 -1.67 -1. -0.33 0.33 1. 1.67 2.33 3. ]

3.1.5 绘制图形

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

def f(x):
    return (x-2)*x*(x+2)

x=np.linspace(-3,3,10)
plt.plot(x,f(x))
plt.show

在这里插入图片描述

3.1.6 装饰图形

例:画两条曲线:(x-1)x(x+2)与(x-2)x(x+2)

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

def f2(x,w):
    return (x-w)*x*(x+2)

#定义x
x=np.linspace(-3,3,100)

#绘制图形
plt.plot(x,f2(x,2),color="r",label="$w=2$")                    #label:标签。label="$标签内容$"。
plt.plot(x,f2(x,1),color="cornflowerblue",label="$w=1$")

plt.legend(loc="upper left")       #显示图例:upper,lower,left,right  legend:传说,图例,说明。
plt.ylim(-15,15)                   #y轴的范围:plt.ylim(n1,n2)
plt.title("$f_2(x)$")              #标题:plt.title("$名字$")
plt.xlabel("$x$")                  #x标签:plt.xlabel("$x轴标签$") 
plt.xlabel("$y$")                  #y标签:plt.xlabel("$y轴标签$")
plt.grid(True)                     #网格线:plt.grid(True)显示网格线。plt.grid(False)不显示网格线。默认不显示。
plt.show()

显示:

在这里插入图片描述

3.1.7 并列显示多张图片

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

def f2(x,w):
    return (x-w)*x*(x+2)

x=np.linspace(-3,3,100)

plt.figure(figsize=(10,3))                    # plt.figure(figsize=(w,h)):用于指定整个绘制区域的大小,宽度w,高度h。figure:数值。
plt.subplots_adjust(wspace=0.5,hspace=0.5)    # plt.subplots_adjust(wspace=w,hspace=h):调节两相邻区域的横向间隔与纵向间隔。
for i in range(6):                            #for循环,i从0取到5
    plt.subplot(2,3,i+1)
    plt.title(i+1)
    plt.plot(x,f2(x,i),color="k")                   # 绘图:k为颜色代码,color="k"。
    plt.ylim(-20,20)
    plt.grid(True)
plt.show()    

显示:

这里是引用

3.2 绘制三维函数

3.2.1 包含两个变量的函数

例:绘制函数f(x0,x1)=(2x0^ 2+x1^ 2)exp(-(2x0^ 2+x1^2))

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline 

# 定义函数
def f3(x0,x1):
    ans=(2*x0**2+x1**2)*np.exp(-(2*x0**2+x1**2))
    return ans
    
#根据x0,x1计算f3
xn=9
x0=np.linspace(-2,2,xn)
x1=np.linspace(-2,2,xn)
y=np.zeros((len(x0),len(x1)))
for i0 in range(xn):
    for i1 in range(xn):
        y[i1,i0]=f3(x0[i0],x1[i1])
        
print(np.round(y,2))

[[0. 0. 0.01 0.05 0.07 0.05 0.01 0. 0. ]
[0. 0.01 0.06 0.18 0.24 0.18 0.06 0.01 0. ]
[0. 0.02 0.15 0.33 0.37 0.33 0.15 0.02 0. ]
[0. 0.04 0.24 0.35 0.19 0.35 0.24 0.04 0. ]
[0. 0.05 0.27 0.3 0. 0.3 0.27 0.05 0. ]
[0. 0.04 0.24 0.35 0.19 0.35 0.24 0.04 0. ]
[0. 0.02 0.15 0.33 0.37 0.33 0.15 0.02 0. ]
[0. 0.01 0.06 0.18 0.24 0.18 0.06 0.01 0. ]
[0. 0. 0.01 0.05 0.07 0.05 0.01 0. 0. ]]

**注:
1.y[a,b]中,列顺序循环b内循环a,与for语句顺序相反;行顺序循环a内循环b,与for语句顺序相同。两者图像关于’‘x_0=x_1对角线’‘对称
2.f3(x0[i0],x1[i1])函数中的顺序与for语句中顺序相同或相反时,图像关于’‘x_0=x_1对角线’'对称。
3.最终成像沿纵轴翻折。
**

例:列方向与行方向的区别

for i0 in range(xn):           # 列方向
    for i1 in range(xn):      
        y[i1,i0]=f3(x0[i0],x1[i1])
for i1 in range(xn):           # 行方向
    for i0 in range(xn):      
        y[i1,i0]=f3(x0[i1],x1[i0])

注:len函数用法:
len函数表示获取list的长度,若x是矩阵,则获取矩阵的行数。

x=np.array([[1,2,3],[3,4,5]])
print(x)
print(len(x))
print(x[0,2])  

[[1 2 3]
[3 4 5]]
2
3

3.2.2 用颜色表示数值(像素图)

def f3(x0,x1):
    ans=(x0+2*x1)
    return ans
    

xn=9
x0=np.linspace(-2,2,xn)        # x0=[-2 -1.5 -1 -0.5 0 0.5 1 1.5 2]
x1=np.linspace(-2,2,xn)        # x1=[-2 -1.5 -1 -0.5 0 0.5 1 1.5 2]
y=np.zeros((len(x0),len(x1)))  # np.zeros(size):元素全是0的矩阵。len(x):获取list的长度,矩阵的行数。先设置空矩阵,再替换。


for i0 in range(xn):           # i0=[0,1,2,3,4,5,6,7,8] 行
    for i1 in range(xn):       # i1=[0,1,2,3,4,5,6,7,8] 列
        y[i1,i0]=f3(x0[i0],x1[i1])
print(np.round(y,2))           # 输出y,保留两位小数。

plt.figure(figsize=(3.5, 3))    # 指定绘图区域,宽3.5,高3
plt.gray()                     # 指定灰色色调显示
plt.pcolor(y)                  # 显示矩阵的颜色
plt.colorbar()                 # 显示矩阵色阶
plt.show()                     

显示:

在这里插入图片描述

注:像素图中会将矩阵搜索准顺序的(0,0)原来在左上角,放置在左下角,上下翻转。无论行顺序还是列顺序。

3.2.3 绘制三维立体图:surface

surface:曲面

def f3(x0,x1):
    ans=(2*x0**2+x1**2)*np.exp(-(2*x0**2+x1**2))
    return ans
    
#根据x0,x1计算f3
xn=9
x0=np.linspace(-2,2,xn)        # x0=[-2 -1.5 -1 -0.5 0 0.5 1 1.5 2]
x1=np.linspace(-2,2,xn)        # x1=[-2 -1.5 -1 -0.5 0 0.5 1 1.5 2]
y=np.zeros((len(x0),len(x1)))  # np.zeros(size):元素全是0的矩阵。len(x):获取list的长度,矩阵的行数。先设置空矩阵,再替换。

for i0 in range(xn):           # i0=[0,1,2,3,4,5,6,7,8] 行
    for i1 in range(xn):       # i1=[0,1,2,3,4,5,6,7,8] 列
        y[i1,i0]=f3(x0[i0],x1[i1])
print(np.round(y,2))  

from mpl_toolkits.mplot3d import Axes3D        # “from 库名 import 函数名”:调用函数。
X,Y=np.meshgrid(x0,x1)                         # 构造网格坐标矩阵,大小与y相同。

plt.figure(1,figsize=(5,3.5))               # 指定图像大小。figure:数字,图像。
ax=plt.subplot(111,projection='3d')         # 用于直接指定划分方式和位置进行绘图。 子图类型3d,极点图,等。默认线型图。将图形的id的返回值保存在ax中。
ax.plot_surface(X,Y,y,rstride=1,cstride=1,alpha=0.3,color='blue',edgecolor='black')   
# surface:表面,使显露。rstride:每个方向的采样步幅。cstride:控制列采样。subplot创建网格,将多个图滑倒一个平面上。plot:画出v,情节n。
# ax.plot_surface(x,y,z,rstride=1,cstride=1,alpha=0.3,color='blue',edgecolor='black')
# 画出3D图,x横坐标,y纵坐标,z函数值;rstride:行之间的跨度;cstride:列之间的跨度。用于指定纵轴横轴每隔几个元素绘制一条线。数值越小采样点越多。
# alpha用0-1的实数指定透明度,1不透明。edgecolor:网格线的颜色
ax.set_zticks((0,0.2))                      # 如果z轴刻度采用默认值,数值会重叠在一起。使用函数将刻度显示限定为0,5,10。
ax.view_init(75,-95)                         # 用ax.view_init(变量1,变量2)调节三维图形的方向,变量1表示纵向的旋转角度,变量2表示横向的旋转角度。正:顺时针

plt.figure(2,figsize=(5,3.5))               # 指定图像大小。figure:数字,图像。
ax=plt.subplot(111,projection='3d')         # 用于直接指定划分方式和位置进行绘图。 子图类型3d,极点图,等。默认线型图。将图形的id的返回值保存在ax中。
ax.plot_surface(X,Y,y,rstride=5,cstride=5,alpha=0.3,color='blue',edgecolor='black')   
ax.set_zticks((0,0.2))                      # 如果z轴刻度采用默认值,数值会重叠在一起。使用函数将刻度显示限定为0,0.2。
ax.view_init(75,-95)  
plt.show()

显示:

在这里插入图片描述

注:np.meshgrid()函数
X,Y=np.meshgrid(x,y)将两个坐标轴上x,y的点转化为平面上的网格,生成网格点坐标矩阵,原理为简单复制.设x轴有m个数据(是长度为m的向量),y轴有n个数据(是长度为n的向量),x,y轴相互垂直。则通过Meshgrid函数X, Y = np.meshgrid(x, y),最终生成两个矩阵X,Y,且X,Y都是n*m的二维矩阵。已知原理为简单复制,那么就是X为将一维的x在y方向上复制n次生成的二维数组,Y在x方向上同理.在Z方向上的值为(xi,yi),之后可用plt.plot(x,y)显示网格点。
之后用plt.plot(X,Y)画图时,X表示所有个网格点位置的横坐标,Y表示所有网格点位置的纵坐标。

注:当输入X[i1,i0]和Y[i1,i0]时,输出f3为y[i1,i0].
在这里插入图片描述
例:绘制exp(-t)*cos2πt

def f(t):
	return np.exp(-t) * np.cos(2*np.pi*t)

t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)

plt.figure(1)        # 创建画板1
plt.subplot(211)     # 画板分割,选取第一份
plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')   # 画图:'bo':蓝色圆圈点状图。'k':黑色的简写,默认线型图。
plt.subplot(212)     #画板选取第二份
plt.plot(t2, np.cos(2*np.pi*t2), 'r--')     # 画出cos的函数,选择红色点状线。

plt.figure(2)        # 创建画板2
plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')   
plt.show()

显示:

在这里插入图片描述

3.2.4 绘制等高线

xn=50
x0=np.linspace(-2,2,xn)
x1=np.linspace(-2,2,xn)

y=np.zeros((xn,xn))
for i0 in range(xn):
    for i1 in range(xn):
        y[i1,i0]=f3(x0[i0],x1[i1])

xx0,xx1=np.meshgrid(x0,x1)                      # 分辨率50*50。contour:轮廓,外形。clabel:等高线。format:fmt格式化。

plt.figure(1,figsize=(4,4))
cont=plt.contour(xx0,xx1,y,5,colors='black')     # plt.contour用于绘制等高线。5:显示的高度有5个等级,等高线为黑色。返回值保存在con中.
                                                 # 传入整数时,等高线的条数;
cont.clabel(fmt='%.2f',fontsize=8)               # cont.clabel。fmt:写入文件的格式保留两位小数。fontsize:字体大小。
plt.xlabel('$x_0$',fontsize=14)                  
plt.ylabel('$x_1$',fontsize=14)
plt.show()

显示:

在这里插入图片描述

重要函数:

1.调用函数
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

图像在jupyter中显示

2.np.random.seed(x):
用于指定随机数,无需赋值给谁,为了方便复现。

3.np.arange(a,b,n)与np.linspace(a,b,n)
np.arange(a,b,n):以n为间距,[a,b)区间。左闭右开。
np.linspace(a,b,n):[a,b]闭区间,共n个数字。左闭右闭。

4.np.round(x)与np.round(x,n)
np.round(x):对x所有元素四舍五入为整数。
np.round(x,n):对x所有元素四舍五入,保留n位有效数字。

5.np.exp()
指数函数,()内为指数

6.二维函数绘制与优化
plt.plot(x,y,color=“r”,label=“ w = 2 w=2 w=2”) 创建图形,该线条过x,y对应的点。颜色为“red”,标题为“w=2”
plt.legend(loc=“upper left”) #显示图例:upper,lower,left,right legend:传说,说明,标注。
plt.ylim(n1,n2) :设置并返回图像中y轴的范围
plt.ysticks((0,1)):设置y轴的刻度为0,1.
plt.title(“ 名字 名字 名字”) :标题,位于正上方。
plt.xlabel(“ x 轴标签 x轴标签 x轴标签”) :x轴标签,x轴正下方。
plt.xlabel(“ y 轴标签 y轴标签 y轴标签”) :y轴标签,y轴正下方。
plt.grid(True) :显示网格线。
plt.grid(False):不显示网格线。默认不显示。
plt.show():显示图像。

7.并列显示多张图
plt.figure(1,figsize=(w,h)) :创建画板1,不指定大小为方形画板,指定整个绘制区域的大小,宽度w,高度h。
plt.subplot(n1,n2,n):用于直接指定划分方式和位置进行绘图。将画板分割成n1行,n2列后的第n个区域。其编号顺序为 左上为1,右下为最末尾。
注:与矩阵定义顺序相同。plt.subplot(n1,n2,n)中的n为从1开始的。
plt.subplots_adjust(wspace=w,hspace=h):调节一块画板中两相邻区域的横向间隔与纵向间隔。放在哪都行。

8.1用颜色表示数值:(像素图)
plt.gray():灰色色调。
plt.pcolor(y):显示矩阵y的颜色。
plt.colorbar() :显示矩阵色阶。(不同颜色的标准数值)

8.2用颜色表示数值:(三维立体图surface)
from mpl_toolkits.mplot3d import Axes3D :从mpl_toolkits.mplot3d库引入Axes3D函数。
X,Y=np.meshgrid(x0,x1) :构建网格坐标矩阵,大小与目标矩阵y相同。
ax=plt.subplot(111,projection=‘3d’) :子图类型3D(常见3D图,极点图,默认线型图)
ax.plot_surface(X,Y,y,rstride=1,cstride=1,alpha=0.5,color=‘blue’,edgecolor=‘black’)
画出3D图,x横坐标,y纵坐标,z函数值;rstride:曲面上网格行之间的跨度;cstride:曲面上网格列之间的跨度。用于指定纵轴横轴每隔几个元素绘制一条线。数值越小采样点越多。alpha用0-1的实数指定透明度,1不透明。edgecolor:网格线的颜色
surface:表面,使显露。rstride:每个方向的采样步幅。cstride:控制列采样。subplot创建网格,将多个图滑倒一个平面上。plot:画出v,情节n。
ax.set_zticks((0,1)):将z轴刻度显示限定为0,1
ax.view_init(变量1,变量2):调节三维图形的方向,变量1为纵向的旋转角度,变量2为横向的旋转角度。

8.3用颜色表示数值:(等高线)
cont=plt.contour(xx0,xx1,y,5,colors=‘black’):plt.contour用于绘制等高线。横坐标,纵坐标,函数值。5:显示的高度有5个等级,等高线颜色为黑色。返回值保存在cont中。传入整数时,表示等高线的近似条数。
cont.clabel(fmt=‘%.2f’,fontsize=8):等高线的标注,fmt:写入文件的格式保留两位小数。fontsize:字体大小。

9.plt.quiver(a,b,c,d):风场箭头图:(a,b)为点的坐标,(c,d)为箭头的方向。箭头的方向是梯度的方向,上升最快的方向;箭尾的方向是地势低的方向。斜面越陡,箭头越长。

单词:

matplotlab:matrix:矩阵。plot:v绘制。lab:实验室。
seed:种子
random:随机的
range:范围
np.array:array:数组,一系列。dimensionality:维度。ndarray:多维数组。
linspace:linear space:线性等分向量。
round:大概,四舍五入。
plot:v绘制。n情节
label:标签
cornflowerblue:矢车菊蓝色。corn:谷子。
legend:n传说。图片的文字说明。
ylim:limit:限制,边界。
grid:网格,栅栏。
subplot:subroutine:子程序。表示画板中的子画板分割。
plt.subplots_adjust:adjust:v调整
wspace:width宽度
hspace:high高度
len():length长度
ans:answer答案
figsize:figure:v绘图 n数字,数学图形,(书中)图、表。size:大小,尺寸
gray:灰色
pcolor:伪色彩。pseudo:假的伪装的。
colorbar:色阶。bar:n酒吧,条状物。
surface:曲面,表面
mpl_toolkits.mplot3d:tool:kit:成套工具。
Axes3D:axes坐标轴
meshgrid:产生格点矩阵。mesh:v生成网格 n网状物,网络
projection:n投射,投影。project:n项目,v投射,推算
zticks:tick:标记、刻度
view_init:view图像,initialization:初始化
contour:n轮廓,等高线。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值