使用具有 sklearn 亲和力传播的稀疏矩阵



我在使用 scipy COO 稀疏矩阵作为亲和力传播的输入时遇到了问题,但它与 numpy 数组配合得很好。

举个例子,假设我的相似性矩阵是:

[[1.0, 0.9, 0.2]
 [0.9, 1.0, 0.0]
 [0.2, 0.0, 1.0]]

矩阵版

import numpy as np
import sklearn.cluster
simnp = np.array([[1,0.9,0.2],[0.9,1,0],[0.2,0,1]])
affprop = sklearn.cluster.AffinityPropagation(affinity="precomputed")
affprop.fit(simnp)

按预期工作。

稀疏矩阵版本

import scipy.sparse as sps
import sklearn.cluster
simsps = sps.coo_matrix(([1,1,1,0.9,0.9,0.2,0.2],([0,1,2,0,1,0,2],[0,1,2,1,0,2,0])),(3,3))
affprop = sklearn.cluster.AffinityPropagation(affinity="precomputed")
affprop.fit(simsps)

返回以下错误

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:PythonPython27libsite-packagessklearnclusteraffinity_propagation_.py", line 301, in fit
    copy=self.copy, verbose=self.verbose, return_n_iter=True)
  File "C:PythonPython27libsite-packagessklearnclusteraffinity_propagation_.py", line 90, in affinity_propagation
    preference = np.median(S)
  File "C:PythonPython27libsite-packagesnumpylibfunction_base.py", line 3084, in median
    overwrite_input=overwrite_input)
  File "C:PythonPython27libsite-packagesnumpylibfunction_base.py", line 2997, in _ureduce
    r = func(a, **kwargs)
  File "C:PythonPython27libsite-packagesnumpylibfunction_base.py", line 3158, in _median
    return mean(part[indexer], axis=axis, out=out)
  File "C:PythonPython27libsite-packagesnumpycorefromnumeric.py", line 2878, in mean
    out=out, keepdims=keepdims)
  File "C:PythonPython27libsite-packagesnumpycore_methods.py", line 70, in _mean
    ret = ret.dtype.type(ret / rcount)
ValueError: setting an array element with a sequence.

我的笔记本电脑没有足够的 RAM 来获取密集矩阵,因此想要使用稀疏矩阵。

我做错了什么?

谢谢。

http://scikit-learn.org/stable/modules/generated/sklearn.cluster.AffinityPropagation.html

拟合(X, y=无) 参数:
X:类似数组的形状(n_samples、n_features)或(n_samples、n_samples)

预测(X) 参数:
X : {数组状,稀疏矩阵},形状(n_samples,n_features)

http://scikit-learn.org/stable/modules/generated/sklearn.cluster.SpectralClustering.html

拟合(X, y=无) 参数:
X :数组状或稀疏矩阵,形状(n_samples、n_features)

因此,某些方法确实接受稀疏矩阵。但AffinityPropagation.fit并没有提出这种说法。 这是文档遗漏,还是表明它不适用于稀疏矩阵? 您的错误表明后者 - 由于某种原因,它尚未适应稀疏。

我不是scikit-learn的用户,但已经回答了几个关于该包中稀疏矩阵的问题。 我的印象是稀疏处理相对较新,在某些情况下,他们必须使用todense()将稀疏矩阵变回密集矩阵。

就像我在评论中写的那样,numpy代码本身并不能正确处理稀疏矩阵。 仅当它将操作委托给稀疏方法时,它才有效。 看来np.mediannp.mean没有正确委派给sparse.coo_matrix.mean

尝试:

np.median(simnp)
np.mean(simnp)
simnp.mean()

关于sklearn当前状态的更新(2019年6月)可能会有所帮助。

在最初提出问题时,已经修复了一个问题,报告了 AffinityPropagation 不适用于稀疏矩阵。最近(2019 年 5 月)再次报道 AffinityPropagation 不适用于稀疏矩阵。

总结实际上是:

  • 仅当亲和力不是预先计算而是欧几里得时,拟合才适用于稀疏矩阵(因为它调用sklearn.metrics.euclidean_distances它适用于稀疏矩阵)。这实际上在内存消耗方面没有任何优势。
  • 如果亲和力是预先计算的,则拟合不适用于稀疏矩阵。 当前的阻塞代码行似乎是中位数的计算。

最新更新