作者: Sam (甄峰)
sam_code@hotmail.com
#Matrix
matrix_int = np.array([[1,2], [3,4], [5,6]])
print("matrix_int:\n", matrix_int)
print("shape:", matrix_int.shape)
print("type:", type(matrix_int))
关于矩阵是使用2D array 还是 numpy.matrix. 很多人推荐使用2D array. 首先, array才是numpy的标准数据结构。 其次,绝大多数numpy操作返回的是array而不是numpy.matrix 对象。
机器学习中常用的数据类型如:向量(vector), 矩阵(Matrix), 张量(Tensor)。
他们在Python中如何创建,维护和处理。尝试记录如下。
Python原生数据结构中,并没有对这些类型进行定义。所以我们通常采用Python Package
numpy中最主要最常用的数据结构---ndarray(多维数据)来模拟之。 对数据的数据,则可以采用scipy
package.
1. 向量(vector):
numpy 可以创建多维数组(ndarray).只需要创建一个一维数组,即可模拟vector.
既可以创建行向量,也可以创建列向量。
vector_row = np.array([1, 2, 3, 4])
print("vector_row:\n", vector_row)
print("shape:", vector_row.shape)
print("type:", type(vector_row))
print("")
vector_column = np.array([[1], [2], [3], [4]])
print("vector_column:\n", vector_column)
print("shape:", vector_column.shape)
print("type:", type(vector_column))
print("vector_row:\n", vector_row)
print("shape:", vector_row.shape)
print("type:", type(vector_row))
print("")
vector_column = np.array([[1], [2], [3], [4]])
print("vector_column:\n", vector_column)
print("shape:", vector_column.shape)
print("type:", type(vector_column))
vector_row: [1 2 3 4]
shape: (4,)
type: numpy.ndarray
vector_column: [[1] [2] [3] [4]]
shape: (4, 1)
type: nupy.ndarray
2. 矩阵(Matrix):
2.1:矩阵的创建:
numpy可以创建多维数组(ndarray). 创建一个二维数组,即可模拟matrix.
#Matrix
matrix_int = np.array([[1,2], [3,4], [5,6]])
print("matrix_int:\n", matrix_int)
print("shape:", matrix_int.shape)
print("type:", type(matrix_int))
matrix_int:
[[1 2] [3 4] [5 6]]
shape: (3, 2)
type:numpy.ndarrdy
numpy也提供了专门的数据结构来表示矩阵--numpy.matrix
mat_object =np.mat([[1,2], [3,4], [5,6]])
print("mat_object:\n", mat_object)
print("shape:", mat_object.shape)
print("type:", type(mat_object))
print("mat_object:\n", mat_object)
print("shape:", mat_object.shape)
print("type:", type(mat_object))
mat_object:
[[1 2] [3 4] [5 6]]
shape: (3, 2)
type: numpy.matrix
关于矩阵是使用2D array 还是 numpy.matrix. 很多人推荐使用2D array. 首先, array才是numpy的标准数据结构。 其次,绝大多数numpy操作返回的是array而不是numpy.matrix 对象。
2.2: 稀疏矩阵:
若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。
矩阵的稀疏性可以用一个得分来量化,也就是矩阵中零值的个数除以矩阵中元素的总个数。
机器学习中,有大量稀疏矩阵的例子,例如:
用户是否在一个电影目录中有曾经看过的电影。
用户是否在一个产品目录中有已经购买过的产品。
在一个歌曲目录中数出收听过的歌曲的数量。
2.2.1: 稀疏的问题:
稀疏矩阵会导致两个问题: 空间复杂度,时间复杂度。
非常大的矩阵,需要大量的空间存储。而只是对资源的浪费,因为0值不包含任何有意义的信息。
而巨大的矩阵,计算有很耗费时间。
因为稀疏矩阵导致问题,而机器学习领域稀疏矩阵很常见,所以必须想办法处理之。
直观的想法就是使用另一个节约空间的方法来表示稀疏矩阵。零值被忽略,只记录非零值。
多个数据结构可以用来有效地构造一个稀疏矩阵;下面列出了三个常见的例子。
Dictionary of Keys。在将行和列索引映射到值时使用字典。
List of Lists。矩阵的每一行存储为一个列表,每个子列表包含列索引和值。
Coordinate List。一个元组的列表存储在每个元组中,其中包含行索引、列索引和值。
还有一些更适合执行高效操作的数据结构;下面列出了两个常用的示例。
压缩的稀疏行。稀疏矩阵用三个一维数组表示非零值、行的范围和列索引。
压缩的稀疏列。与压缩的稀疏行方法相同,除了列索引外,在行索引之前被压缩和读取。
被压缩的稀疏行,也称为CSR,通常被用来表示机器学习中的稀疏矩阵,因为它支持的是有效的访问和矩阵乘法。
Python Package
---scipy提供了使用多种数据结构创建稀疏矩阵的工具,以及将稠密矩阵转换为稀疏矩阵的工具。许多在numpy和scipy函数可以透明的操作scipy稀疏数组。
scikit-learn和Keras也可以透明的操作scipy稀疏数组。
NumPy数组中的稠密矩阵可以通过调用csr_matrix()函数将其转换为一个稀疏矩阵。
NumPy并没有提供一个函数来计算矩阵的稀疏性。
但可以方便的计算出。
因为numpy可以计算出ndarray中的非零个数。
np.count_nonzero(matrix_data)
3. 对Vector,
Matrix的操作:
3.1: 对多个元素同时应用某个操作:
对一个array中的多个元素同时应用于某个函数。
可以利用numpy的vecotrize (函数的向量化)来解决。
numpy的vectorize类将一个函数转换成另一个函数,这个函数能把某个操作应用于数组的全部元素或者一个切片上。
3.2: 找到ndarray中的最大值和最小值:
使用numpy的max和min方法。
matrix_data1 = np.array([[1,2,3],[4,5,6],[7,8,9], [10, 11, 12]])
print("max is:",np.max(matrix_data1))
print("min is:", np.min(matrix_data1))
max is: 12 min is: 1
numpy的max和min方法支持对一个特定轴向取最大最小值。
3.3: 获取ndarray的平均值,方差和标准差:
方差和标准差,是度量一组数据和其平均值之间的散布程度的测量。
方差:
方差用来计算每一个变量(观察值)与总体均数之间的差异。为避免出现离均差总和为零,离均差平方和受样本含量的影响,统计学采用平均离均差平方和来描述变量的变异程度
标准差:
标准差(Standard Deviation),在概率统计中最常使用作为统计分布程度
(statistical dispersion)上的测量。标准差定义是总体各单位标准值与其平均数
离差平方的算术平均数的平方根。它反映组内个体间的离散程度。
numpy的mean, var和std方法。
3.4:矩阵的变形:
在不改变元素值的情况下,改变一个ndarray的形状(行数和列数)
使用numpy的reshape。
reshape方法可以重构一个数组,维持该数组原来的数据不变,只改变行数和列数。但要求原数组和新数组元素个数必须相同。
reshape()特殊的参数:
-1:
只有一个整数作为参数:
把矩阵展开,即转换为一个一维数组:
方法一:
reshape(1, -1)
方法二:
flatten.
3.5: 矩阵和向量的转置:
使用T方法。
3.6:矩阵的秩:
可以使用numpy中的线性代数方法 matrix_rank.
但没明白ndim和rank的区别。
3.7: 矩阵行列式:
numpy的det
3.8:获取矩阵的对角线元素:
diagonal
3.9:矩阵的迹:
其对角线元素之和
trace
3.10:方阵的特征值和特征向量:
3.11: 两个向量的点积:
3.12: 矩阵的相互加减:
3.13:矩阵的乘法:
3.14:矩阵的逆:
3.15:产生随机数:
附录: