稀疏矩阵蟒蛇分割故障

时间:2015-08-31 23:25:20

标签: segmentation-fault scipy sparse-matrix gensim

当我通过其转置乘以scipy稀疏矩阵时,我得到了分段错误。我在互联网上搜索过但找不到任何答案。任何帮助表示赞赏。

>>> import cPickle
>>> fs = open('vec.pickle', 'rb')
>>> vec = cPickle.load(fs)
>>> vec
<3020x512 sparse matrix of type '<type 'numpy.float64'>' with 26008 stored elements in Compressed Sparse Column format>
>>> vec.max()
10.0
>>> vec.min()
0.0
>>> vec * vec.T
Segmentation fault: 11

我不认为这是内存问题,因为维度很小。如果该信息有帮助,则vec对象由gensim创建。

我也不认为这是溢出问题,因为元素的范围是[0.0,10.0]

泡菜对象在这里: https://drive.google.com/open?id=0B3DJbsn85XMvdmFYT0MzZVFjOVU

1 个答案:

答案 0 :(得分:2)

加载此vec

In [13]: vec.tocoo()

ValueError                                Traceback (most recent call    ....
    226             if self.col.max() >= self.shape[1]:
    227                 raise ValueError('column index exceedes matrix dimensions')

ValueError: row index exceedes matrix dimensions

因此,腌制物体中有些东西是错误的。

In [38]: vec
Out[38]: 
<3020x512 sparse matrix of type '<type 'numpy.float64'>'
    with 26008 stored elements in Compressed Sparse Column format>

In [37]: vec.indices.max()
Out[37]: 3255

按形状,它应该有3020行,512列。但indices属性最多可达3255,大于行数。

所以有一个问题是,我们可以从这些数据中恢复有效的矩阵吗?而另一个,这在最初腌制时是有效的。 gensim中的错误更可能是scipy.sparse中的错误。

在这样的简单测试有效之前,我不会对vec*vec.T计算得出任何结论。

我可以创建一个新的有效稀疏矩阵:

In [44]: newvec = sparse.csc_matrix((vec.data,vec.indices,vec.indptr))

In [45]: newvec.shape
Out[45]: (3256, 512)

In [46]: newvec * newvec.T
Out[46]: 
<3256x3256 sparse matrix of type '<type 'numpy.float64'>'
    with 314081 stored elements in Compressed Sparse Column format>

In [47]: newvec.tocoo()
Out[47]: 
<3256x512 sparse matrix of type '<type 'numpy.float64'>'
    with 26008 stored elements in COOrdinate format>

我的猜测是在编译的矩阵乘法中发生了段故障。在某些时候,vec.indices引用了超出分配给C数组的空间的一些阈值。为了速度,C代码不像普通的Python和numpy代码那样彻底地检查边界。实际上,矩阵乘法假定其输入结构良好。