稀疏矩阵及其应用案例
来源:互联网 发布:linux 查看pythonpath 编辑:程序博客网 时间:2024/05/20 18:18
稀疏矩阵
- 稀疏矩阵的类别
- 稀疏矩阵的L2范数计算
- 合并两个行向量
目录
- 稀疏矩阵
- 目录
- 稀疏矩阵
- 应用I 稀疏矩阵的L2范数计算
- 应用II合并两个行向量
稀疏矩阵
本节介绍python的scipy.sparse中提供的稀疏矩阵,如下
- bsr_matrix, short for Block Sparse Row matrix.
- coo_matrix, short for A sparse matrix in COOrdinate format.
- csc_matrix, short for Compressed Sparse Column matrix.
- csr_matrix, short for Compressed Sparse Row matrix.
- dia_matri, short for Sparse matrix with DIAgonal storage.
- dok_matrix, short for Dictionary Of Keys based sparse matrix.
- lil_matrix, short for Row-based linked list sparse matrix
- spmatrix
你可以参考文献 [ 官方文档 ]
PS:如果这个链接过时,可以google搜索关键字”Spicy.sparse”,第一个结果就是这个官方文档。
我只用了压缩稀疏行矩阵(csr_matrix),理由是每个不同种的矩阵都提供了相互转换的方法,比如csr_matrix,提供了csr_matrix.tocoo()函数,可以实现将一个csr_matrix矩阵,转换成coo_matrix形式的矩阵。例如,
def convert(): from scipy.sparse import csr_matrix sparsev = csr_matrix([0, 2, 0, 0]) print type(sparsev) sparseCoo = sparsev.tocoo() print type(sparseCoo)>>> convert()
输出如下结果:
<class 'scipy.sparse.csr.csr_matrix'><class 'scipy.sparse.coo.coo_matrix'>
应用I, 稀疏矩阵的L2范数计算
虽然scipy的lingalg(i.e., scipy.sparse.linalg.norm)提供了各种计算范数的函数,可参考文献 [ linalg.norm官方文档 ]
貌似不能直接从稀疏矩阵或稀疏向量直接计算。由于我的稀疏向量的维数是4w左右,用先转换成ndarray的形式后,再计算太耗时了,所以就自己写了函数计算L2范数。
代码如下:
###稀疏矩阵实现, compute L2 via csr_matrix的操作def getL2SparseConcise(diffSparseVector): temp = csr_matrix.multiply(diffSparseVector, diffSparseVector) L2 = temp.sum(axis=1).tolist()[0][0] return np.sqrt(L2)###norm实现, convert csr_matrix vector to a ndarray, and compute L2def getL2ViaNorm(diffSparseVector): from scipy.sparse.linalg import norm denseDSV = np.array(convertSparse2List(diffSparseVector)) tempDense = norm(csr_matrix(denseDSV)) return np.sqrt(tempDense)###ndarray实现,def getL2Dense(diffSparseVector): ## verify dense denseDSV = np.array(convertSparse2List(diffSparseVector)) tempDense = denseDSV.dot(denseDSV) return np.sqrt(tempDense)
你可以从我的git上下载源文件 [ git 源文件 ].
运行,并查看直接用稀疏矩阵进行计算和通过转换成ndarray的dense矩阵然后计算的差异。
结论如下:
时间上用稀疏矩阵直接计算是很高效的。在时间上, 稀疏矩阵实现比norm实现(getL2ViaNorm function)快,norm实现(getL2ViaNorm function)比ndarray实现快。
norm的L2计算有问题,貌似开了两次根号。
应用II,合并两个行向量
我需要把两个稀疏的向量合并成一个矩阵,受文献3指导。
核心思想
调用稀疏矩阵的vstack,可以把两个向量,按照行合并成一个矩阵。
调用稀疏矩阵的hstack,可以把两个向量,按照列合并成一个矩阵
由于这方法,类似,就举出按照行合并的例子。
def incrementalBuildByRow(rowA, rowB): from scipy.sparse import vstack rowUnion = vstack([rowA, rowB]) return rowUnion## test code:def incrementalBuildByRowTest(): from scipy.sparse import csr_matrix sparsev1 = csr_matrix([0, 2, 0, 0]) sparsev2 = csr_matrix([2, 0, 1, 0]) ll = incrementalBuildByRow(sparsev1, sparsev2) print "type", type(ll) print ll.todense()if __name__ == "__main__": incrementalBuildByRowTest()
输出结果是
type <class 'scipy.sparse.csr.csr_matrix'>[[0 2 0 0] [2 0 1 0]]
[1]: 官方文档 https://docs.scipy.org/doc/scipy/reference/sparse.html
[2]: 稀疏矩阵的存储格式 http://blog.csdn.net/anshan1984/article/details/8580952
[3]: scipy矩阵操作 http://blog.csdn.net/nkwangjie/article/details/17502443
[4]: vstack manual https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.vstack.html#scipy.sparse.vstack
[5]: hstack manual https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.hstack.html#scipy.sparse.hstack
- 稀疏矩阵及其应用案例
- 稀疏矩阵及其用法
- 稀疏矩阵及其实现
- 稀疏矩阵应用
- 稀疏矩阵及其转置
- 稀疏矩阵及其逆置矩阵
- 关于稀疏矩阵求行列式及其余子式
- 矩阵-----对称矩阵及其压缩存储&&稀疏矩阵
- 矩阵乘法及其应用
- 稀疏矩阵的压缩存储及其转置算法
- 稀疏矩阵的转置操作及其乘法操作
- 【LB】稀疏矩阵的快速转置原理及其算法
- 稀疏矩阵的压缩存储及其两种转置算法
- 稀疏矩阵的初始化及其转置(源代码+截图)
- 稀疏矩阵的压缩存储及其转置算法
- 稀疏矩阵
- 稀疏矩阵
- 稀疏矩阵
- Codeforces 798A
- Kotlin-36.类型安全的构建器/生成器(Type-Safe Builders)
- 51Nod-1689-逛街
- synchronized 同步锁(java)实例解析
- wav文件格式分析
- 稀疏矩阵及其应用案例
- const与指针
- RecyclerView嵌套EditView实时更新Item数据
- 学习 shell —— 条件判断 if 的参数
- 【Spring】Spring MVC返回ModelAndView,视图解析器找不到jsp
- 从照片的三维重建(3D Reconstruction)——MVS系列(1)
- c/c++整理--静态成员和临时对象
- Flask——Jinja2 学习笔记
- hdu2047阿牛的EOF牛肉串