Quantcast
Channel: Sam的技术Blog
Viewing all articles
Browse latest Browse all 158

机器学习中的数据处理--基于Python数据结构和处理

$
0
0
作者: Sam (甄峰)   sam_code@hotmail.com

机器学习中常用的数据类型如:向量(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))


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))

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], [101112]])
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:产生随机数


 



附录:










 

Viewing all articles
Browse latest Browse all 158

Trending Articles