【问题标题】:how to turn a matrix into a sparse matrix and protobuf it如何将矩阵转换为稀疏矩阵并对其进行protobuf
【发布时间】:2019-11-19 06:49:18
【问题描述】:

我有一个包含 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

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

.

当我尝试将其插入训练/测试拆分时,它会给我带来更多错误:

发现样本数量不一致的输入变量:[1, 100000]

【问题讨论】:

  • 在 Python 中,每个分配都是独立的。将 lil 分配给 X 会替换之前的 data.drop 分配。并且您的 lil_matrix 调用不符合文档。重读docs.scipy.org/doc/scipy/reference/generated/…
  • 我仍然不明白它对数据 tbh 做了什么。他们没有一个例子,这让人沮丧。当我尝试打印数据时,它说它的 1 个存储元素。如果你明白,你能详细说明吗?谢谢
  • 我不知道你在做什么。这段代码的来源是什么,或者至少是它的灵感来源。 data 的来源是什么。这是什么?
  • 基本上只是想将我的数据应用到本教程中。但是当我执行 lil sparse 方法时,它会将其变为 1 个值。没看懂..github.com/juliensimon/dlnotebooks/blob/master/sagemaker/…
  • 您没有以同样的方式使用lil_matrix 调用。你甚至检查过我给你的文档链接吗?我看到您可能从该教程中借来的点点滴滴,但没有一致之处。在对底层语言(和模块)了解有限的情况下修改教程可能会令人沮丧。

标签: numpy scipy sparse-matrix amazon-sagemaker matrix-factorization


【解决方案1】:

您链接的notebook 正在创建一个“空白”稀疏矩阵,并从它从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。在链接中,相关行是:

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

【讨论】:

  • 谢谢!是的,我终于找到了一些有用的例子,这也有帮助。所以我明白了 lil_ 矩阵对它的作用。我想做的就是把我的矩阵变成 spaese,这样我就可以 protobuf 它因为 aws 不接受 CSV 格式的数据。它只是一直拒绝它。所以这就是它的真正意义..如果你有任何意见,它表示赞赏!感谢您提供详细的示例 - 它有帮助。 scypi 对稀疏矩阵的了解很少,也没有示例——boo
  • 所以我用它而不是读取数据 -data=np.genfromtxt('The_Data_for_channel.csv',delimiter=',') 然后我像这样拆分它 X=data[:,1 :] y=data[:,0:1] X=X.astype('float32') y=y.astype('float32') 然后我尝试了这种更简单的方法来 protobuf 它但它给出了 ms 估值错误:标签必须是一个向量,这段代码实际上稀疏了它 X=lil_matrix(X) 但它仍然给我一个不是向量的错误。
  • 前面的错误代码是这样的。我认为我 1 并且不明白为什么它会引发错误.. 如果标签不是无:95 如果不是 len(labels.shape) == 1: ---> 96 raise ValueError("Labels must be a Vector") 97 if labels.shape[0] not in array.shape: 98 raise ValueError("Label shape {} not compatible with array shape {}".format(
猜你喜欢
  • 2023-04-10
  • 2021-11-25
  • 2017-07-02
  • 2014-12-21
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
相关资源
最近更新 更多