sklearn svm中稀疏的预先计算的Gram矩阵?

时间:2014-02-07 23:33:59

标签: python scipy scikit-learn svm sparse-matrix

我想将稀疏的预先计算的Gram矩阵传递给sklearn.svm.SVC.fit。这是一些有效的代码:

import numpy as np
from sklearn import svm
X = np.array([[0, 0], [1, 1]])
y = [0, 1]
clf = svm.SVC(kernel='precomputed')
gram = np.dot(X, X.T)
clf.fit(gram, y) 

但如果我有:

from scipy.sparse import csr_matrix
sparse_gram = csr_matrix(gram)
clf.fit(sparse_gram, y)

我明白了:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/sklearn/svm/base.py", line 191, in fit
    fit(X, y, sample_weight, solver_type, kernel)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/svm/base.py", line 235, in _dense_fit
    max_iter=self.max_iter)
TypeError: Argument 'X' has incorrect type (expected numpy.ndarray, got csr_matrix)

我最终进入了_dense_fit函数(参见上面第235行所示的位置)这一事实让我觉得我需要做一些特别的事情来判断是否适合使用稀疏矩阵。但我不知道该怎么做。

更新:我刚检查了拟合函数的代码(https://sourcegraph.com/github.com/scikit-learn/scikit-learn/symbols/python/sklearn/svm/base/BaseLibSVM/fit),现在我更加困惑了:

    self._sparse = sp.isspmatrix(X) and not self._pairwise

    if self._sparse and self._pairwise:
        raise ValueError("Sparse precomputed kernels are not supported. "
                         "Using sparse data and dense kernels is possible "
                         "by not using the ``sparse`` parameter")

所以我想,正如它所说的那样,“不支持稀疏的预先计算的内核”,这确实是我想做的,所以我可能运气不好。 (这是一个我实际上没有看到错误的错误吗?)

1 个答案:

答案 0 :(得分:1)

  

所以我可能运气不好。

是的。对不起。

  

这是一个我实际上没有看到错误的错误吗?

是的:发布的代码集

self._sparse = sp.isspmatrix(X) and not self._pairwise

然后检查

self._sparse and self._pairwise

提出异常。这种情况是不可能实现的。我只是推了patch来解决这个问题,谢谢你的报告。