2014-02-07 3 views
1

Я хотел бы передать разреженную предварительно вычисленную матрицу Грама в 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") 

Так что я думаю, как он говорит, «разреженные предварительно вычисленные ядра не поддерживаются» и это действительно то, что я хотел сделать, поэтому мне, наверное, не повезло. (Это ошибка, которую я действительно не видел в этой ошибке?)

ответ

1

, так что я, вероятно, не повезло.

Да. Извини за это.

Является ли это ошибкой, что я действительно не видел эту ошибку?

Да это: освобожденный код устанавливает

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

, а затем проверяет

self._sparse and self._pairwise 

поднять исключение. Это условие невозможно выполнить. Я просто нажал patch, чтобы исправить это, спасибо за отчет.

Смежные вопросы