SciPy、NumPy和SciKit-learn,创建稀疏矩阵。

7

我正在尝试对文本进行分类。我的数据集太大了,正如这里建议的那样,我需要使用稀疏矩阵。现在我的问题是,向稀疏矩阵添加元素的正确方法是什么?比方说,我有一个名为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等一切都很陌生。)

2
你真的应该阅读这个链接:http://scikit-learn.org/dev/auto_examples/document_classification_20newsgroups.html - zenpoy
2
有些事情需要花费时间。也许你应该投入一些时间学习Python、Numpy和Scipy的教程。例如,在我回答另一个问题时,我给你指出了一些链接,而zenpoy也给了你另一个链接。我猜想你没有读那些链接,因为在我回答另一个问题后仅仅几分钟你就发布了这个问题。 - HerrKaputt
1
我确实阅读了那些内容,甚至还制作了一个可行的示例。但是稀疏矩阵的更新是我找不到的东西。如果你不知道,我也不指望你回答。 - Olivier_s_j
1
@Ojtwist - 你在问题下标记了sklearn,所以这些就是你得到的答案。如果你只是问如何连接两个csr_matrix,你会得到完全不同的答案... - zenpoy
sparse.dok_matrix 是增量工作的更好格式。请参见 http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.dok_matrix.html#scipy.sparse.dok_matrix 上的示例。 - hpaulj
显示剩余2条评论
1个回答

14

Scikit-learn有很好的文档,以及非常好的教程,你在自己发明前真的应该阅读它们。 这个 是第一个需要阅读的,它逐步解释了如何分类文本,这个 则是使用稀疏表示进行文本分类的详细示例。

特别关注他们在一部分讨论稀疏表示的部分。通常,如果您想使用带有线性核的SVM并且数据量很大,则LinearSVC(基于Liblinear)更好。

关于你的问题 - 我相信有很多种方法可以连接两个稀疏矩阵(顺便说一下,这就是你应该在谷歌上寻找其他方法的东西),这里提供了一种方法,但是你必须将csr_matrix转换为另一种稀疏矩阵类型coo_matrixIs there an efficient way of concatenating scipy.sparse matrices?

编辑: 当连接两个矩阵(或一个矩阵和一个数组,它是一个一维的矩阵)时,一般的想法是连接X1.dataX2.data并操纵它们的indicesindptr(或在coo_matrix的情况下的rowcol)来指向正确的位置。有些稀疏表示对特定操作更好,而对其他操作则更复杂,您应该了解csr_matrix并确定这是否是最佳表示方式。但我真的建议您从我上面发布的那些教程开始。


1
如果您想将SVM适配到一个非常大的数据集上,那么SGDClassifier会更好。在默认设置下,它近似于线性SVM。 - Fred Foo
第一段链接更新:http://scikit-learn.org/stable/auto_examples/text/document_classification_20newsgroups.html - Olga Botvinnik
1
来自zenpoy的第二个链接和@olga-botvinnik的更新现在都已经失效。请尝试访问以下链接: https://scikit-learn.org/0.19/auto_examples/text/document_classification_20newsgroups.html - Rhubbarb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接