当我通过其转置乘以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
答案 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代码那样彻底地检查边界。实际上,矩阵乘法假定其输入结构良好。