SciPy NumPy 和 SciKit-learn ,创建一个稀疏矩阵

Posted

技术标签:

【中文标题】SciPy NumPy 和 SciKit-learn ,创建一个稀疏矩阵【英文标题】:SciPy NumPy and SciKit-learn , create a sparse matrix 【发布时间】:2012-11-24 09:39:24 【问题描述】:

我目前正在尝试对文本进行分类。我的数据集太大,建议here,我需要使用稀疏矩阵。我现在的问题是,将元素添加到稀疏矩阵的正确方法是什么?例如,假设我有一个矩阵 X,这是我的输入。

X = np.random.randint(2, size=(6, 100))

现在这个矩阵 X 看起来像一个 ndarray 的 ndarray(或类似的东西)。

如果我这样做了

X2 = csr_matrix(X)

我有稀疏矩阵,但是如何向稀疏矩阵添加另一个元素? 例如这个密集元素:[1,0,0,0,1,1,1,0,...,0,1,0] 到稀疏向量,我如何将它添加到稀疏输入矩阵?

(顺便说一句,我对 python、scipy、numpy、scikit ......一切都很陌生)

【问题讨论】:

你真的应该阅读这个:scikit-learn.org/dev/auto_examples/… 这是我使用 python 的第二天,这对于第二天阅读来说有点过头了。顺便说一句,我也发现了 有些事情只是慢慢来。也许你应该花一些时间来做一些关于 Python、Numpy 和 Scipy 的教程。例如,在另一个问题的答案中,我为您指出了一些链接,而 zenpoy 给了您另一个链接。我假设您没有阅读这些链接,因为您在我回答另一个问题几分钟后发布了这个问题。 我确实读过那些,我什至做了一个有效的虚拟示例。虽然稀疏矩阵的更新不是我能找到的。如果你不知道,我不希望你回答。 @Ojtwist - 你在 sklearn 下标记了你的问题,所以这些就是你得到的答案。如果你只是问如何连接两个csr_matrix,你会得到完全不同的答案...... 【参考方案1】:

Scikit-learn 有一个很棒的文档,里面有很棒的教程,你真的应该在尝试自己发明它之前阅读。 This 是第一个读到的,它解释了如何对文本进行分步分类,this one 是使用稀疏表示进行文本分类的详细示例。

特别注意他们在this 部分讨论稀疏表示的部分。一般来说,如果你想使用带线性内核的 svm 并且数据量很大,LinearSVC(基于 Liblinear)会更好。

关于您的问题 - 我确信有很多方法可以连接两个稀疏矩阵(顺便说一句,这是您应该在 google 中寻找的其他方法),这是一个,但您必须转换从 csr_matrix 到 coo_matrix,这是另一种稀疏矩阵:Is there an efficient way of concatenating scipy.sparse matrices?。

编辑:当连接两个矩阵(或一个矩阵和一个一维矩阵的数组)时,一般的想法是连接 X1.dataX2.data 并操纵它们的 indicesindptrs(或rowcol,如果是coo_matrix)指向正确的位置。一些稀疏表示对于特定操作更好,而对于其他操作更复杂,您应该阅读csr_matrix 并查看这是否是最佳表示。但我真的敦促你从我上面发布的那些教程开始。

【讨论】:

如果您想将 SVM 拟合到 真正 大数据集,那么 SGDClassifier 会更好。在默认设置下,它近似于线性 SVM。 第一段链接更新:scikit-learn.org/stable/auto_examples/text/… zenpoy 的第二个链接和@olga-botvinnik 的更新现在都坏了。试试看:scikit-learn.org/0.19/auto_examples/text/…

以上是关于SciPy NumPy 和 SciKit-learn ,创建一个稀疏矩阵的主要内容,如果未能解决你的问题,请参考以下文章

Linux 下安装 numpy 和 scipy

在numpy和scipy中的因子

numpy.polyfit 和 scipy.polyfit 有啥区别? [复制]

使用 pip 安装 SciPy 和 NumPy

如何检查 NumPy 和 SciPy 中的 BLAS/LAPACK 链接?

用 numpy 和/或 scipy 插入 3D 体积