Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.5. Scipy : high-level scientific computing
Scipy Lecture Notes学习笔记(一)Getting started with Python for science
1.5. Scipy : high-level scientific computing
scipy
可以与其他标准科学计算库比较,例如GSL(用于C和C ++的GNU科学库)或Matlab的工具箱。scipy
是Python中科学例程的核心软件包; 它意味着在numpy
阵列上高效运行,所以numpy和scipy可以携手共事。
在实现例程之前,需要检查Scipy中是否已经实现了所需的数据处理。作为非专业程序员,科学家往往倾向于重新发明轮子,这会导致错误的,非最优的,难以共享和不可维护的代码。相比之下,Scipy
例程经过优化和测试,因此应尽可能使用。
scipy
软件包包含专用于科学计算中常见问题的各种工具箱。其不同的子模块对应不同的应用,如插值,集成,优化,图像处理,统计,特殊功能等。
- 文件输入/输出:
scipy.io
- 特殊功能:
scipy.special
- 线性代数运算:
scipy.linalg
- 插值:
scipy.interpolate
- 优化和适合度:
scipy.optimize
- 统计和随机数字:
scipy.stats
- 数值积分:
scipy.integrate
- 快速傅立叶变换:
scipy.fftpack
- 信号处理:
scipy.signal
- 图像处理:
scipy.ndimage
scipy.cluster |
矢量量化/ Kmeans |
scipy.constants |
物理和数学常数 |
scipy.fftpack |
傅里叶变换 |
scipy.integrate |
集成例程 |
scipy.interpolate |
插值 |
scipy.io |
数据输入和输出 |
scipy.linalg |
线性代数例程 |
scipy.ndimage |
n维图像包 |
scipy.odr |
正交距离回归 |
scipy.optimize |
优化 |
scipy.signal |
信号处理 |
scipy.sparse |
稀疏矩阵 |
scipy.spatial |
空间数据结构和算法 |
scipy.special |
任何特殊的数学函数 |
scipy.stats |
统计 |
1.5.1 文件输入/输出:scipy.io
Loading and saving
输入:
from scipy import io as spio a = np.ones((3, 3)) spio.savemat('file.mat', {'a': a}) # savemat expects a dictionary data = spio.loadmat('file.mat') data['a']
输出:
array([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.]])
读取图像
from scipy import misc misc.imread('fname.png') # Matplotlib also has a similar function import matplotlib.pyplot as plt plt.imread('fname.png')
1.5.3. Linear algebra operations: scipy.linalg
scipy.linalg.det()
函数计算方阵的行列式:
输入:
from scipy import linalg arr = np.array([[1, 2], [3, 4]]) print(linalg.det(arr)) #计算方阵的行列式 iarr = linalg.inv(arr) #计算方阵的逆 arr = np.arange(9).reshape((3, 3)) + np.diag([1, 0, 1]) uarr, spec, vharr = linalg.svd(arr) #进行奇异值分解linalg.svd #原始矩阵可以重新由通过的输出的矩阵乘法进行还原 sarr = np.diag(spec) print(arr) svd_mat = uarr.dot(sarr).dot(vharr) print(np.allclose(svd_mat, arr)) #判断两个矩阵是否相等 print(svd_mat)
输出:
-2.0 [[1 1 2] [3 4 5] [6 7 9]] True [[1. 1. 2.] [3. 4. 5.] [6. 7. 9.]]
1.5.4. Interpolation: scipy.interpolate 插值
矩阵分解
- 矩阵分解是将数据矩阵分解为多个独立部分的过程。
- 矩阵分解可以将原始矩阵表示成新的易于处理的形式,这种新形式是两个或多个矩阵的乘积。(类似代数中的因数分解)
- 举例:如何将12分解成两个数的乘积?(1,12)、(2,6)、(3,4)都是合理的答案。
SVD 是矩阵分解的一种类型,也是矩阵分解最常见的技术
- SVD 将原始的数据集矩阵 Data 分解成三个矩阵 U、∑、V
- 举例:如果原始矩阵 Datam∗nDatam∗n 是m行n列,
- Um∗nUm∗n 表示m行n列
- ∑m∗k∑m∗k 表示m行k列
- Vk∗nVk∗n 表示k行n列。
Datam∗n=Um∗k∗∑k∗k∗Vk∗n
- 上述分解中会构建出一个矩阵∑,该矩阵只有对角元素,其他元素均为0(近似于0)。另一个惯例就是,∑的对角元素是从大到小排列的。这些对角元素称为奇异值。
- 奇异值与特征值(PCA 数据中重要特征)是有关系的。这里的奇异值就是矩阵 Data∗DataTData∗DataT 特征值的平方根。
- 普遍的事实:在某个奇异值的数目(r 个=>奇异值的平方和累加到总值的90%以上)之后,其他的奇异值都置为0(近似于0)。这意味着数据集中仅有 r 个重要特征,而其余特征则都是噪声或冗余特征。