scikit-learn: 使用DBSCAN聚类文本文档

我正在尝试使用scikit-learn来聚类文本文档。总的来说,我能够找到解决方法,但我在处理具体问题时遇到了困难。我找到的大多数例子都是使用scikit-learn进行聚类,并且使用的是k-means聚类算法。将这些使用k-means的例子应用到我的环境中,原则上是可行的。然而,由于我不知道聚类的数量,k-means并不适合。从我目前所读到的内容来看——如果有需要请纠正我——DBSCAN或MeanShift似乎在我的情况下更为合适。scikit-learn网站为每种聚类算法提供了示例。现在的问题是,使用DBSCAN和MeanShift时,我遇到了无法理解,更不用说解决的错误。

我的最小代码如下:

docs = []for item in [database]:    docs.append(item)vectorizer = TfidfVectorizer(min_df=1)X = vectorizer.fit_transform(docs)X = X.todense() # <-- 这一行是解决问题的必要步骤db = DBSCAN(eps=0.3, min_samples=10).fit(X)...

(我的文档已经过处理,即已移除停用词并应用了Porter词干提取器。)

当我运行这段代码时,在实例化DBSCAN并调用fit()时,我得到了以下错误:

...File "/usr/local/lib/python2.7/dist-packages/sklearn/cluster/dbscan_.py", line 248, in fitclust = dbscan(X, **self.get_params())File "/usr/local/lib/python2.7/dist-packages/sklearn/cluster/dbscan_.py", line 86, in dbscann = X.shape[0]IndexError: tuple index out of range

点击dbscan_.py中抛出错误的那一行,我注意到了以下代码

...X = np.asarray(X)n = X.shape[0]...

当我直接在我的代码中使用这两行进行测试时,我得到了相同的错误。我不太清楚np.asarray(X)在这里做了什么,但在执行X.shape = ()命令后。因此X.shape[0]会导致错误——在此之前,X.shape[0]正确地指代了文档的数量。出于好奇,我从dbscan_.py中移除了X = np.asarray(X)。当我这样做时,某些计算变得非常繁重。但几秒钟后,我得到了另一个错误:

...File "/usr/lib/python2.7/dist-packages/scipy/sparse/csr.py", line 214, in extractor(min_indx,max_indx) = check_bounds(indices,N)File "/usr/lib/python2.7/dist-packages/scipy/sparse/csr.py", line 198, in check_boundsmax_indx = indices.max()File "/usr/lib/python2.7/dist-packages/numpy/core/_methods.py", line 17, in _amaxout=out, keepdims=keepdims)ValueError: zero-size array to reduction operation maximum which has no identity

简而言之,我完全不知道如何让DBSCAN工作,或者我可能错过了什么,整体上来说。


回答:

scikit-learn中的实现似乎假设您处理的是有限的向量空间,并希望找到您数据集的维度。文本数据通常表示为稀疏向量,但现在具有相同的维度。

您的输入数据可能不是数据矩阵,但scikit-learn的实现需要它们是一个矩阵。

您需要找到不同的实现。也许可以尝试ELKI中的实现,它非常快,并且应该没有这种限制。

您需要花一些时间首先理解相似性。对于DBSCAN,您必须以对您的数据有意义的方式选择epsilon。没有经验法则;这是特定于领域的。因此,您首先需要弄清楚哪个相似性阈值意味着两个文档是相似的。

Mean Shift实际上可能需要您的数据是固定维度的向量空间。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注