如何将矩阵变成稀疏矩阵并将其原型化

how to turn a matrix into a sparse matrix and protobuf it

我有一个包含 16 列和 100,000 行的数据集,我正在尝试为矩阵分解训练做准备。我正在使用以下代码将其拆分并将其变成稀疏矩阵。

X=data.drop([data.columns[0]],axis='columns')
y=data[[1]]
X=lil_matrix(100000,15).astype('float32')
y=np.array(y).astype('float32')
X

但是当我 运行 它时,我得到这个错误:

<1x1 sparse matrix of type '' with 1 stored elements in LInked List format> .

当我尝试将它插入 training/testing split 时,它给我带来了更多错误:

Found input variables with inconsistent numbers of samples: [1, 100000]

您的 linked notebook 正在创建一个 'blank' 稀疏矩阵,并根据它从 csv.

读取的数据设置选定元素

一个简单的例子:

In [565]: from scipy import sparse                                                                           
In [566]: M = sparse.lil_matrix((10,5), dtype=float)                                                         
In [567]: M                                                                                                  
Out[567]: 
<10x5 sparse matrix of type '<class 'numpy.float64'>'
    with 0 stored elements in LInked List format>

请注意,我使用 (10,5) 来指定矩阵形状。 () 事!这就是我强调阅读 docs 的原因。在 link 中,相关行是:

X = lil_matrix((lines, columns)).astype('float32')

现在我可以设置几个元素,就像我设置密集数组一样:

In [568]: M[1,2] = 12.3                                                                                      
In [569]: M[3,1] = 1.1                                                                                       
In [570]: M                                                                                                  
Out[570]: 
<10x5 sparse matrix of type '<class 'numpy.float64'>'
    with 2 stored elements in LInked List format>

我可以使用 toarray 将矩阵显示为密集数组(不要尝试使用大尺寸)。

In [571]: M.toarray()                                                                                        
Out[571]: 
array([[ 0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. , 12.3,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  1.1,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ]])

如果我省略 (),它会生成一个只有一个元素(第一个数字)的 (1,1) 矩阵。

In [572]: sparse.lil_matrix(10,5)                                                                            
Out[572]: 
<1x1 sparse matrix of type '<class 'numpy.int64'>'
    with 1 stored elements in LInked List format>
In [573]: _.A                                                                                                
Out[573]: array([[10]], dtype=int64)

再看看你的代码。你设置 X 值两次,一旦它是一个数据帧。第二次是这个糟糕的 lil 初始化。第二次没有利用第一次X.

X=data.drop([data.columns[0]],axis='columns')
...
X=lil_matrix(100000,15).astype('float32')