时间 | 版本 | 修改人 | 描述 |
---|---|---|---|
2023年2月4日11:15:16 | V0.1 | 宋全恒 | 新建文档 |
环境搭建
首先搭建jupyter环境,方便可视化
(base) root@node33-a100:~# docker run --name sqh-learn -d -p 10088:8888 -it 10.101.12.128/framework/jupyter:pytorch-1.10.0-cuda11.3-cudnn8-devel-jupyter-sshd-2.0
9296ffc57f683198dc50d62c52c72e874edf7381de6c8d5390c31c68015424f1
(base) root@node33-a100:~# docker exec -it 9296 bash
注:8888端口为jupyter端口。做端口映射方便访问
问题之No module named ‘matplotlib’
No module named ‘matplotlib’
root@9296ffc57f68:/workspace# pip install matplotlib
问题之No module named ‘seaborn’
关于jupyter环境切换问题
root@9296ffc57f68:/workspace# pip install seaborn
问题之No module named ‘sklearn’
# pip install scikit-learn
Installing collected packages: threadpoolctl, scipy, joblib, scikit-learn
Successfully installed joblib-1.2.0 scikit-learn-1.0.2 scipy-1.7.3 threadpoolctl-3.1.0
问题之No module named ‘sklearn.datasets.samples_generator’
修改代码
from sklearn.datasets import make_blobs
代码解读
代码片段一make_blobs
#%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import seaborn;
from sklearn.linear_model import LinearRegression
from scipy import stats
import pylab as pl
seaborn.set()
from sklearn.datasets import make_blobs
X, y = make_blobs(n_samples=50, centers=2,
random_state=0, cluster_std=0.60)
上述代码,主要是实现了样本的制作,含义是生成50个样本点,中心一共有两个,上述打印X,y输出如下:
上述代码中,最重要的是make_blobs函数的作用:
make_blobs的用法
data, label = make_blobs(n_features=2, n_samples=100, centers=3, random_state=3, cluster_std=[0.8, 2, 5])
n_features表示每一个样本有多少特征值
n_samples表示样本的个数
centers是聚类中心点的个数,可以理解为label的种类数
random_state是随机种子,可以固定生成的数据
cluster_std设置每个类别的方差
可以看出原来的代码片段中,只有n_features有个默认值,
总而言之,就是就是生成了数据,特征和标签都生成了。
代码片段2np.linespace
np.linespace()函数生成指定范围内指定个数的一维数组
xfit = np.linspace(-1, 3.5)
上述的代码片段,用来生成数组
函数声明如下:
def linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None):
1.在指定的间隔[“start”,“stop”]内均匀地返回数字。
2.返回“num”个等间距的样本。
3.endpoint是一个bool类型的值,如果为"Ture",“stop"是最后一个值,如果为"False”,生成的数组不会包含"stop"值
4.retstep是一个bool类型的值,如果为"Ture",会返回样本之间的间隙。
从上述的函数声明可以看出,默认生成的数组的个数为50,包含stop作为最后一个值。可以在Jupyter进行如下的验证:
可以同时返回样本之间的间隙,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iMOOXv1I-1676950443503)(null)]
注: 可以多次运行这个表达式,生成的数据是一样的。
代码片段之scatter
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='spring')
x[:, 0]
上述代码片段中,存在的疑惑主要是x[:, 0]的表示以及各个参数的含义,
在numpy中,x[m,n]是通过numpy库引用数组或矩阵中的某一段数据集的一种写法。
x[:,n]或者x[n,:]
x[:,n]表示在全部数组(维)中取第n个数据,直观来说,x[:,n]就是取所有集合的第n个数据
举例说明:
import numpy as np
X = np.array([[0,1],[2,3],[4,5],[6,7],[8,9],[10,11],[12,13],[14,15],[16,17],[18,19]])
print X[:,0]
而相应的,x[:, 1]则表示
x[n,:]表示在n个数组(维)中取全部数据,直观来说,x[n,:]就是取第n集合的所有数据, x[1,:]即取第一维中下标为1的元素的所有值
扩展用法:x[:,m:n],即取所有数据集的第m到n-1列数据
X = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11],[12,13,14],[15,16,17],[18,19,20]])
print X[:,1:3]
取所有维数据从从第1列到3-1列数据。因此结果为:
scatter
# plt.scatter()函数用于生成一个scatter散点图。
matplotlib.pyplot.scatter(x,
y,
s=20,
c='b',
marker='o',
cmap=None,
norm=None,
vmin=None,
vmax=None,
alpha=None,
linewidths=None,
verts=None,
hold=None,
**kwargs)
参数含义如下:
- x,y:表示的是shape大小为(n,)的数组,也就是我们即将绘制散点图的数据点,输入数据。
- s:表示的是大小,是一个标量或者是一个shape大小为(n,)的数组,可选,默认20。
- c:表示的是色彩或颜色序列,可选,默认蓝色’b’。但是c不应该是一个单一的RGB数字,也不应该是一个RGBA的序列,因为不便区分。c可以是一个RGB或RGBA二维行数组。
- marker:MarkerStyle,表示的是标记的样式,可选,默认’o’。
- cmap:Colormap,标量或者是一个colormap的名字,cmap仅仅当c是一个浮点数数组的时候才使用。如果没有申明就是image.cmap,可选,默认None。
- norm:Normalize,数据亮度在0-1之间,也是只有c是一个浮点数的数组的时候才使用。如果没有申明,就是默认None。
- vmin,vmax:标量,当norm存在的时候忽略。用来进行亮度数据的归一化,可选,默认None。
- alpha:标量,0-1之间,可选,默认None。
参数marker
marker控制的是标记的样式,常见的可以有’o’, ‘+’, ‘*’
参数c
- c:表示的是色彩或颜色序列,可选,默认蓝色’b’。但是c不应该是一个单一的RGB数字,也不应该是一个RGBA的序列,因为不便区分。c可以是一个RGB或RGBA二维行数组。
在这里,c是一个序列,维数与样本的个数相等。
该参数的默认值为‘b’,表示蓝色。效果如下:
表示的是颜色。默认是蓝色’b’,表示的是标记的颜色,或者可以是一个表示颜色的字符,或者是一个长度为n的表示颜色的序列等等如**‘b’=blue,‘y’=yellow,‘k’=black**等
cmap
cmap:Colormap,标量或者是一个colormap的名字,cmap仅仅当c是一个浮点数数组的时候才使用。如果没有申明就是image.cmap,可选,默认None。
参见 cmap的详细解释
在这里需要注意的是,plt.cm.Spectral是一个颜色映射集,但是,并不是说0~5各代表了某个颜色。而是说,参数c的序列中出现了5个不同的值,然后为每一个值分配一个颜色。
示例如下:
a = np.array([1,2,3,4,5])
b= np.array([6,7,8,9,10])
c = np.array([0,1,2,3,4])
plt.scatter(a,b,c=[0,1,0,1,0],s=80,cmap=plt.cm.Spectral)
使用字符串也可以输入,允许的内容如下:
ValueError: 'xx' is not a valid value for name; supported values are 'Accent', 'Accent_r', 'Blues', 'Blues_r', 'BrBG', 'BrBG_r', 'BuGn', 'BuGn_r', 'BuPu', 'BuPu_r', 'CMRmap', 'CMRmap_r', 'Dark2', 'Dark2_r', 'GnBu', 'GnBu_r', 'Greens', 'Greens_r', 'Greys', 'Greys_r', 'OrRd', 'OrRd_r', 'Oranges', 'Oranges_r', 'PRGn', 'PRGn_r', 'Paired', 'Paired_r', 'Pastel1', 'Pastel1_r', 'Pastel2', 'Pastel2_r', 'PiYG', 'PiYG_r', 'PuBu', 'PuBuGn', 'PuBuGn_r', 'PuBu_r', 'PuOr', 'PuOr_r', 'PuRd', 'PuRd_r', 'Purples', 'Purples_r', 'RdBu', 'RdBu_r', 'RdGy', 'RdGy_r', 'RdPu', 'RdPu_r', 'RdYlBu', 'RdYlBu_r', 'RdYlGn', 'RdYlGn_r', 'Reds', 'Reds_r', 'Set1', 'Set1_r', 'Set2', 'Set2_r', 'Set3', 'Set3_r', 'Spectral', 'Spectral_r', 'Wistia', 'Wistia_r', 'YlGn', 'YlGnBu', 'YlGnBu_r', 'YlGn_r', 'YlOrBr', 'YlOrBr_r', 'YlOrRd', 'YlOrRd_r', 'afmhot', 'afmhot_r', 'autumn', 'autumn_r', 'binary', 'binary_r', 'bone', 'bone_r', 'brg', 'brg_r', 'bwr', 'bwr_r', 'cividis', 'cividis_r', 'cool', 'cool_r', 'coolwarm', 'coolwarm_r', 'copper', 'copper_r', 'crest', 'crest_r', 'cubehelix', 'cubehelix_r', 'flag', 'flag_r', 'flare', 'flare_r', 'gist_earth', 'gist_earth_r', 'gist_gray', 'gist_gray_r', 'gist_heat', 'gist_heat_r', 'gist_ncar', 'gist_ncar_r', 'gist_rainbow', 'gist_rainbow_r', 'gist_stern', 'gist_stern_r', 'gist_yarg', 'gist_yarg_r', 'gnuplot', 'gnuplot2', 'gnuplot2_r', 'gnuplot_r', 'gray', 'gray_r', 'hot', 'hot_r', 'hsv', 'hsv_r', 'icefire', 'icefire_r', 'inferno', 'inferno_r', 'jet', 'jet_r', 'magma', 'magma_r', 'mako', 'mako_r', 'nipy_spectral', 'nipy_spectral_r', 'ocean', 'ocean_r', 'pink', 'pink_r', 'plasma', 'plasma_r', 'prism', 'prism_r', 'rainbow', 'rainbow_r', 'rocket', 'rocket_r', 'seismic', 'seismic_r', 'spring', 'spring_r', 'summer', 'summer_r', 'tab10', 'tab10_r', 'tab20', 'tab20_r', 'tab20b', 'tab20b_r', 'tab20c', 'tab20c_r', 'terrain', 'terrain_r', 'turbo', 'turbo_r', 'twilight', 'twilight_r', 'twilight_shifted', 'twilight_shifted_r', 'viridis', 'viridis_r', 'vlag', 'vlag_r', 'winter', 'winter_r'
注:cmap = plt.cm.Spectral实现的功能是给label为1的点一种颜色,给label为0的点另一种颜色。
确实也没太理解这个参数的具体控制,感觉像是能够控制颜色的变化和风格。
代码片段之绘制直线
# 其实随意给定3组参数,就可以画出3条不同的直线,但它们都可以把图上的2类样本点分隔开
for m, b, d in [(1, 0.65, 0.33), (0.5, 1.6, 0.55), (-0.2, 2.9, 0.2)]:
yfit = m * xfit + b
plt.plot(xfit, yfit, '-k')
plt.fill_between(xfit, yfit - d, yfit + d, edgecolor='none', color='#AAAAAA', alpha=0.4)
plt.xlim(-1, 3.5);
如果仅有for循环,可以看到,仅仅绘制一条线。把散点图的绘制放在一个cell中运行,可以看到完整的效果
plt.plot函数
参见plot详解
plt.plot()函数是matplotlib.pyplot模块下的一个函数, 用于画图
它可以绘制点和线, 并且对其样式进行控制.
示例:
import matplotlib.pyplot as plt
x=[3,4,5] # [列表]
y=[2,3,2] # x,y元素个数N应相同
plt.plot(x,y)
plt.show()
plt.plot(x, y, “格式控制字符串”)
format_string参见 控制格式字符串
所以,'-k’表示的是黑色实线。
plt.fill_between
plt.fill_between(x, y1, y2),其中x是横坐标,y1和y2是两条曲线,这个函数的作用是用颜色填充y1和y2这两条曲线之间的区域。
该函数最常用的用法是已知均值曲线和标准差,画出标准差覆盖的区域
参见 fill_between总结
只需要循环填充你想要填充的部分,设置填充的上下限,就可以实现这个功能了
xlim
plt.xlim() 显示的是x轴的作图范围,同时plt.ylim() 显示的是y轴的作图范围,而 plt.xticks() 表达的是x轴的刻度内容的范围
1 plt.xlim(num1, num2)
2 plt.xlim(xmin=num1,xmax=num2)
用于设置x轴的范围。
总结
在这个小程序中,使用numpy的数据生成功能(np.linespace),散点图绘制功能,在绘制散点图plt.scatter的时候,可以控制形状、颜色、大小,然后使用了matplotlib库进行直线的绘制。同时对于直线上下的可以进行填充fill_between,使用xflim控制x轴的范围。