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

Posted

技术标签:

【中文标题】sklearn svm中的稀疏预计算Gram矩阵?【英文标题】:Sparse precomputed Gram matrices in sklearn svm? 【发布时间】:2014-03-05 13:40:01 【问题描述】:

我想将一个稀疏的预先计算的 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 行),这让我觉得我需要做一些特别的事情来告诉 fit 使用稀疏矩阵。但我不知道该怎么做。

更新:我刚刚检查了 fit 函数 (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 来解决这个问题,感谢您的报告。

【讨论】:

以上是关于sklearn svm中的稀疏预计算Gram矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

哪个稀疏矩阵表示与 sklearn.svm.LinearSVC 一起使用

无法使用 sklearn 中的稀疏矩阵计算 silhouette_score [关闭]

SVM - 如何对核化的 gram 矩阵进行矢量化?

将自定义函数应用于 sklearn 中的稀疏矩阵

将 sklearn LogisticRegression 系数链接到稀疏矩阵中的项,并获得统计显着性 / C.I

使用 sklearn 对大型稀疏矩阵执行 PCA