当前位置: 代码迷 >> 综合 >> 【每日新知识】Python scipy.sparse模块、COO、CSC、CSR、正则化
  详细解决方案

【每日新知识】Python scipy.sparse模块、COO、CSC、CSR、正则化

热度:94   发布时间:2023-09-18 18:03:58.0

2020.9.7

  • python scipy.sparse模块
  • Coordinate (COO)
    • 代码案例
    • 思路
    • 缺点
  • Compressed Sparse Column (CSC)
    • 代码案例
    • 思路
  • Compressed Sparse Row (CSR)
    • 代码案例
    • 思路
  • 正则化
  • 参考

python scipy.sparse模块

作用:所给变量变成稀疏矩阵
.dailog():稀疏对角矩阵

参考案例:http://codingdict.com/sources/py/scipy.sparse/8465.html

Coordinate (COO)

代码案例

import scipy.sparse as sp
import numpy as np
row = np.array([0, 1, 2, 0])
col = np.array([0, 3, 0, 1])
data = np.array([4, 5, 6, 7])
sp.coo_matrix((data, (row, col)), shape=(4, 4)).toarray()
#sp.coo_matrix((data, (row, col))).toarray()

【每日新知识】Python scipy.sparse模块、COO、CSC、CSR、正则化

思路

coo思路最简单,最普遍,告诉哪行哪列的值是多少,没有告诉的用0补充的方式构造稀疏矩阵,例如:row的第一个数字是0,col的第一个数字是0,data的第一个数字是4,可以得知,稀疏矩阵的第0行,第0列的值是4.
其中,参数shape可以加上也可以不加,按需求来。

缺点

同时要有行列信息,空间上并不是最优的。

Compressed Sparse Column (CSC)

代码案例

import scipy.sparse as sp
import numpy as np
indptr = np.array([0, 1, 3, 4])
indices = np.array([0, 2, 0, 1])
data = np.array([1, 2, 3, 4])
sp.csc_matrix((data, indices, indptr), shape=(3, 3)).toarray()

【每日新知识】Python scipy.sparse模块、COO、CSC、CSR、正则化

思路

由第一个coo的缺点,自然会想到将行或列变成一个范围,由此减少行或列重复出现数字的空间。
csc的思路就将列的范围给出,行索引号给出,这样可以构造一个稀疏矩阵。具体的,我们拿上面的例子来说,indptr是[0,1,3,4],拆开变成表示列的范围(可以对应下图来看,方便理解):

  • [0,1)代表data[0]是第一列,=》1是在第一列
  • [1,3)代表data[1]、data[2]是第二列,=》2,3在第二列
  • [3,4)代表data[3]是第三列,=》4在第三列【每日新知识】Python scipy.sparse模块、COO、CSC、CSR、正则化
    那么每列有哪些值就可以确定了,接下来只要通过indices确定值所在的行号(索引)即可。

Compressed Sparse Row (CSR)

代码案例

import scipy.sparse as sp
import numpy as npindptr = np.array([0, 1, 3, 4])indices = np.array([0, 2, 0, 1])data = np.array([1, 2, 3, 4])sp.csr_matrix((data, indices, indptr), shape=(3, 3)).toarray()

【每日新知识】Python scipy.sparse模块、COO、CSC、CSR、正则化

思路

想法与coc一致,就是将coc的列范围变成行范围,coc的行索引变成列索引即可

正则化

在机器学习上,正则化的主要作用是,对loss产生影响,防止过拟合,一般以损失函数的额外项出现,

L1正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择
L2正则化可以防止模型过拟合(overfitting);一定程度上,L1也可以防止过拟合

Q: 什么是特征?
A: 特征即为样本属性,特征分为:”相关特征“,”无关特征“。相关特征即是对当前任务有用的特征,反之为无关特征。

Q: 什么是特征选择?
A: 特征选择是从特征集合中选择“相关特征”子集的过程。

Q: 特征选择为什么要使用稀疏模型?
A: 由上面的概念就很容易想到,将特征集合想象为一个特征矩阵,想要筛选出精而简的特征,肯定是希望有用的特征权值越大,无用特征权值越小可以忽略甚至可以是0,再加上由于特征集合往往比较大,由此,稀疏矩阵就具备了这样的功能,可以帮助筛选出相关度高的特征。不过,也可以发现一个问题稀疏矩阵需要的空间是很大的,特别是特征集合空间特别大的时候,所需要的稀疏权值矩阵也需要很大的空间,但是稀疏矩阵由于很大一部分都是0,那么这样就会造成空间上的浪费,在复杂模型中也会导致计算空间溢出以及速度变慢。

参考

https://www.jianshu.com/p/9671c568096d
https://blog.csdn.net/jinping_shi/article/details/52433975
https://blog.csdn.net/l7H9JA4/article/details/80248749