首页 文章

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

提问于
浏览
17

我正在尝试使用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() # <-- This line was needed to resolve the isse

db = DBSCAN(eps=0.3, min_samples=10).fit(X)
...

(我的文档已经处理完毕,即已删除了停用词并且已应用了Porter Stemmer . )

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

...
File "/usr/local/lib/python2.7/dist-packages/sklearn/cluster/dbscan_.py", line 248, in fit
clust = dbscan(X, **self.get_params())
File "/usr/local/lib/python2.7/dist-packages/sklearn/cluster/dbscan_.py", line 86, in dbscan
n = 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_bounds
max_indx = indices.max()
File "/usr/lib/python2.7/dist-packages/numpy/core/_methods.py", line 17, in _amax
out=out, keepdims=keepdims)
ValueError: zero-size array to reduction operation maximum which has no identity

总之,我不知道如何让DBSCAN工作,或者我可能错过了什么 .

2 回答

  • 6

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

    您的输入数据可能不是数据矩阵,但是sklearn实现需要它们是一个 .

    您需要找到不同的实现 . 也许尝试ELKI中的实现,这非常快,不应该有这个限制 .

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

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

  • 14

    看起来支持DBSCAN的稀疏表示as of Jan. 2015 .

    我将sklearn升级到了0.16.1,它在文本上对我有用 .

相关问题