成对距离在具有无信息错误消息的稀疏矩阵上失败

时间:2017-07-05 21:45:18

标签: python scipy scikit-learn sparse-matrix

from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from scipy.spatial import distance

X = CountVectorizer().fit_transform(docs)
X = TfidfTransformer(use_idf=False).fit_transform(X)
print (X.shape) #prints (100, 1760)

然而,当我尝试计算对距离时,我得到了这个错误:

distance.pdist(X, metric='cosine')
  

ValueError:必须传递一个二维数组。

形状表明X是一个二维数组,可能是什么问题?

===== 2017年7月6日更新======

这是scipy中的一个错误,sklearn具有稀疏矩阵的正确实现。

我在这里建议对scipy存储库进行代码更改:

https://github.com/scipy/scipy/pull/7566

===== 2018年2月23日更新======

如果你到了这里,你可能也遇到过这个问题。

自从我提出的单线修复程序被推送到scipy存储库以来已经超过8个月了。

请评论herehere,以获得scipy维护者的注意。

1 个答案:

答案 0 :(得分:3)

pdist以:

开头
def pdist(X, metric='euclidean', p=2, w=None, V=None, VI=None):
    ....
    X = np.asarray(X, order='c')

    # The C code doesn't do striding.
    X = _copy_array_if_base_present(X)

    s = X.shape
    if len(s) != 2:
        raise ValueError('A 2-dimensional array must be passed.')

但如果我制作一个scipy.sparse矩阵并应用asarray我就不会得到一个二维数组:

In [258]: from scipy import sparse
In [259]: M = sparse.random(100,100, format='csr')
In [260]: M
Out[260]: 
<100x100 sparse matrix of type '<class 'numpy.float64'>'
    with 100 stored elements in Compressed Sparse Row format>
In [263]: np.asarray(M)
Out[263]: 
array(<100x100 sparse matrix of type '<class 'numpy.float64'>'
    with 100 stored elements in Compressed Sparse Row format>, dtype=object)
In [264]: _.shape
Out[264]: ()

pdist的目的不是接受稀疏矩阵。稀疏矩阵不是ndarray的子类。你必须首先使它密集。

In [266]: np.asarray(M.toarray()).shape
Out[266]: (100, 100)

http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.pairwise_distances.html