【python-机器学习】2. 稀疏矩阵

在机器学习中,数据集往往非常庞大,但是很多情况下,其中包含大量的零元素。在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为 稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为 稠密矩阵

稀疏矩阵只保存矩阵中的非零元素,忽略值为零的剩余元素,这样能节省大量的计算成本。

在压缩的稀疏行(compressed sparse row, CSR) 矩阵中,可以使用下标标记矩阵元素中的非零值,在大型矩阵计算中,有明显的优势。

import numpy as np
from scipy import sparse

# 创建一个矩阵
matrix = np.array([[0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [3, 0, 0, 0, 0, 0]])

# 创建一个压缩的稀疏行(compressed sparse row,CSR)矩阵
matrix_sparse = sparse.csr_matrix(matrix)

print(matrix_sparse)
# 结果:
#  (1, 1)	1
#  (2, 0)	3

在需要的时候,可以通过调用 todense() 函数将稀疏矩阵转换回密集矩阵。

# 重建密集矩阵
B = matrix_sparse.todense()
print(B) 

当然,除了CSR外,还有许多其他类型的稀疏矩阵,比如,压缩的稀疏列矩阵、表中表以及键值对词典等,不同类型的稀疏矩阵适用于不同的场景,需要大家在学习及使用过程中多多比较、总结。

在许多情况中,需要先通过计算矩阵的稀疏性来判断矩阵是稠密矩阵还是稀疏矩阵。虽然Numpy不提供直接计算矩阵稀疏性的函数。但是我们可以通过定义,利用矩阵中的非零值数量和矩阵大小来轻松地将稀疏度计算出来。

Numpy数组中的非零元素的数量可以由 count_nonzero() 函数给出,数组中的元素总个数可以由数组的 size 属性给出。因此,可以将数组稀疏度计算为:

sparsity = 1.0 - np.count_nonzero(matrix) / matrix.size

可得,上文中matrix矩阵的稀疏度为0.8888888888888888。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章