基础科学模块包
前言
在深度学习机器学习的领域当中,Numpy是向量运算或矩阵运算的主力军。它极大简化了向量和矩阵的操作处理。在平时的学习和工作当中,对于Numpy的一些基础操作不是特别熟悉,尤其是高维数据,当沿着某个轴运算的时候,无法确定其运算原理。另外tensorflow里面的api与numpy运算也有着非常相似的操作,容易混淆,在tensorflow计算图中尽量避免使用numpy的api,不然会报错。因此,这篇博客主要总结Numpy、tensorflow、Pandas的知识以及一些api。相关的api参考可以访问各自的数据模块包的官网
Numpy
导入Numpy数据包:
import numpy as np
Numpy的基本数据类型是ndarray
,意味着N-dimensional array
,N维数组。它的属性有ndim:维度数量,shape:一个表示各维度大小的元组,即数组的形状,dtype:一个用于说明数组元素类型的对象。size:元素总个数,即shape中各数组相乘。
基本操作
-
创建数组
创建数组可以通过np.array()
创建numpy数组,它的类型是numpy.ndarray
另外还可以通过np.ones
、np.zeros()
,np.random.random()
根据自己实际的需求生成对应的数组。
-
索引
布尔索引
多维数组的索引
3. 聚合
4. 点乘
5. 矩阵索引
6. 矩阵聚合
不仅可以聚合矩阵中的所有值,还可以使用 axis 参数执行跨行或跨列聚合:
注意: axis=n
表示沿着第n个下边变化的方向。如一个3维的数组a为(3,4,2),每个元素可以表示
a
000
a_{000}
a000,
a
001
a_{001}
a001,
a
010
a_{010}
a010,
a
011
a_{011}
a011,
a
100
a_{100}
a100…以此类推,那么axis=0
求和,表示
a
000
+
a
100
+
a
200
,
a
001
+
a
101
+
a
201
a_{000}+a_{100}+a_{200},a_{001}+a_{101}+a_{201}
a000+a100+a200,a001+a101+a201
常见的一元函数如下:
一元函数 | 说明 |
---|---|
abs、fabs | 计算整数、浮点数或复数的绝对值。对于非复数值,可以使用fabs |
sqrt | 计算各个元素的平方根,相当于arr**0.5 |
square | 计算各元素的平方,相当于arr**2 |
exp | 计算各元素的指数e的x次方 |
log, log10, log2, log1p | 分别为自然对数、底数是10的log,底数为2的log,log(1+x) |
sign | 计算各元素的正负号:1 正数,0 零 , -1 负数 |
cell | 计算各元素的ceiling值,即大于等于该值的最小整数 |
floor | 计算各元素的floor值,即小于等于该值的最大整数 |
isnan | 判断哪些值是NaN的布尔类型数组 |
isfinite,isinf | 分别表示哪些元素是有穷的,哪些元素是无穷的 |
logical_not | 计算各元素not x的真值,相当于 ~ 和 -arr |
- 转置
相关API
np.unique
- 二进制运算
方法 | 描述 |
---|---|
bitwise_and | 按元素计算两个数组的按位与 |
bitwise_or | 按元素计算两个数组的按位或 |
bitwise_xor | 按元素计算两个数组的按位异或 |
invert | 按元素计算按位求逆,或按位求非 |
-
numpy.nditer
参考地址:https://numpy.org/devdocs/reference/generated/numpy.nditer.html#numpy.nditer -
线性代数
矩阵和向量积
方法 | 描述 |
---|---|
dot | 两个数组的点积 |
linalg.multi_dot | 在单个函数调用中计算两个或更多数组的点积,同时自动选择最快的求值顺序 |
vdot | 返回两个向量的点积 |
inner | 计算两个数组的内积 |
outer | 计算两个向量的外积 |
matmul | 计算两个数组的矩阵乘积 |
-
逻辑运算
| 方法 | 描述 |
|–|--|
|logical_and|按元素计算x1和x2的真值|
|logical_or|按元素计算x1或x2的真值|
|logical_not|计算非x元素的真值|
|logical_xor|按元素计算x1 xor x2的真值|
-
数学函数
四舍五入
方法 | 描述 |
---|---|
around | 平均舍入到给定的小数位数 |
round | 将数组舍入到给定的小数位数 |
fix | 四舍五入为0 |
floor | 返回输入的底限 |
ceil | 返回输入的上限 |
- 搜索
方法 | 描述 |
---|---|
argmax | 返回沿着某个轴方向的最大值下标 |
argmin | 返回沿着某个轴方向的最小值下标 |
where | 根据条件选择x中的元素还是y中的元素 |
np.where
np.where
是三元表达式x if confition else y
的矢量化版本。
- 统计相关的
均值和偏差
|方法|描述|
|–|--|
|median|沿着某个轴计算中值|
|average|沿着某个轴计算平均值,有权重|
|mean|沿着某个轴计算平均值|
|std|计算标准差|
|var|计算偏差|
实际应用
- 公式
实现可用于矩阵和向量的数学公式是 NumPy 的关键用例。这就是 NumPy 是 python 社区宠儿的原因。例如均方差公式,它是监督机器学习模型处理回归问题的核心: M S E = 1 n ∑ i = n N ( Y i ^ − Y i ) 2 MSE=\frac{1}{n}\sum^N_{i=n}(\hat{Y_i}-Y_i)^2 MSE=n1i=n∑N(Yi^−Yi)2
对应的numpy公式:
MSE = (1/n)*np.sum(np.square(prediction-labels))
- 数据表示
- 表格和电子表格
- 音频和时间序列
音频文件是样本的一维数组。每个样本都是一个数字,代表音频信号的一小部分。CD 质量的音频每秒包含 44,100 个样本,每个样本是-65535 到 65536 之间的整数。这意味着如果你有一个 10 秒的 CD 质量 WAVE 文件,你可以将它加载到长度为 10 * 44,100 = 441,000 的 NumPy 数组中。如果想要提取音频的第一秒,只需将文件加载到 audio 的 NumPy 数组中,然后获取 audio[:44100]。
Pandas
为了节省时间,这里不做详细的描述了,详情可以查看:pandas中文网
数据可视化
Tensorboard
Tensorboard是Tensorflow的一个神器级工具,给用户提供了模型可视化的功能。在构建神经网络模型过程中,只要模型开始训练,我们需要关心神经网络的参数变化、超参数变化,准确率怎么样、loss收敛了吗以及debug程序。因此Tensorboard通过结合web应用为我们提供这些功能,它将模型训练过程中的细节以图表的形式通过浏览器可视化展现,可以清晰感知weight、bias、accuracy等变化,把握训练趋势。
通过tensorboard提供的图标,可以清楚知道loss和accuracy在每一个epoch中是怎么变化。Tensorboard提供了查看其他内容的功能:
- 在scalars下可以看到accuracy、bias、weight等趋势
- 在images和audio可以看到输入的数据
- 在graphs中可以看到模型的结构
- 在histogram可以看到activations,gradients或者weights等变量每一步的分布
- distribution和histogram是两种不同的形式,可以看到整体状况
- 在embedding看到PCA将高维数据投影到3D空间后的数据关系
Matplotlib
Matplotlib的官方API文档地址:https://matplotlib.org/stable/index.html。
plot(x, y)
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('_mpl-gallery')
# make data
x = np.linspace(0, 10, 100)
y = 4 + 2 * np.sin(2 * x)
# plot
fig, ax = plt.subplots()
ax.plot(x, y, linewidth=2.0)
ax.set(xlim=(0, 8), xticks=np.arange(1, 8),
ylim=(0, 8), yticks=np.arange(1, 8))
plt.show()
scatter(x, y)
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('_mpl-gallery')
# make the data
np.random.seed(3)
x = 4 + np.random.normal(0, 2, 24)
y = 4 + np.random.normal(0, 2, len(x))
# size and color:
sizes = np.random.uniform(15, 80, len(x))
colors = np.random.uniform(15, 80, len(x))
# plot
fig, ax = plt.subplots()
ax.scatter(x, y, s=sizes, c=colors, vmin=0, vmax=100)
ax.set(xlim=(0, 8), xticks=np.arange(1, 8),
ylim=(0, 8), yticks=np.arange(1, 8))
plt.show()
bar/barh
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('_mpl-gallery')
# make data:
np.random.seed(3)
x = 0.5 + np.arange(8)
y = np.random.uniform(2, 7, len(x))
# plot
fig, ax = plt.subplots()
ax.bar(x, y, width=1, edgecolor="white", linewidth=0.7)
ax.set(xlim=(0, 8), xticks=np.arange(1, 8),
ylim=(0, 8), yticks=np.arange(1, 8))
plt.show()
stem
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('_mpl-gallery')
# make data
np.random.seed(3)
x = 0.5 + np.arange(8)
y = np.random.uniform(2, 7, len(x))
# plot
fig, ax = plt.subplots()
ax.stem(x, y)
ax.set(xlim=(0, 8), xticks=np.arange(1, 8),
ylim=(0, 8), yticks=np.arange(1, 8))
plt.show()
step
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('_mpl-gallery')
# make data
np.random.seed(3)
x = 0.5 + np.arange(8)
y = np.random.uniform(2, 7, len(x))
# plot
fig, ax = plt.subplots()
ax.step(x, y, linewidth=2.5)
ax.set(xlim=(0, 8), xticks=np.arange(1, 8),
ylim=(0, 8), yticks=np.arange(1, 8))
plt.show()
hist
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('_mpl-gallery')
# make data
np.random.seed(1)
x = 4 + np.random.normal(0, 1.5, 200)
# plot:
fig, ax = plt.subplots()
ax.hist(x, bins=8, linewidth=0.5, edgecolor="white")
ax.set(xlim=(0, 8), xticks=np.arange(1, 8),
ylim=(0, 56), yticks=np.linspace(0, 56, 9))
plt.show()
boxplot
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('_mpl-gallery')
# make data:
np.random.seed(10)
D = np.random.normal((3, 5, 4), (1.25, 1.00, 1.25), (100, 3))
# plot
fig, ax = plt.subplots()
VP = ax.boxplot(D, positions=[2, 4, 6], widths=1.5, patch_artist=True,
showmeans=False, showfliers=False,
medianprops={"color": "white", "linewidth": 0.5},
boxprops={"facecolor": "C0", "edgecolor": "white",
"linewidth": 0.5},
whiskerprops={"color": "C0", "linewidth": 1.5},
capprops={"color": "C0", "linewidth": 1.5})
ax.set(xlim=(0, 8), xticks=np.arange(1, 8),
ylim=(0, 8), yticks=np.arange(1, 8))
plt.show()
Seaborn
seaborn的官方网站是http://seaborn.pydata.org/。seaborn库还是很强大,对我而言比matplotlib好用多。