Я хотел бы передать разреженную предварительно вычисленную матрицу Грама в sklearn.svm.SVC.fit. Вот некоторые рабочий код:Редкие предварительно вычисленные матрицы грамма в sklearn svm?
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")
Так что я думаю, как он говорит, «разреженные предварительно вычисленные ядра не поддерживаются» и это действительно то, что я хотел сделать, поэтому мне, наверное, не повезло. (Это ошибка, которую я действительно не видел в этой ошибке?)