【问题标题】:scikit-learn: clustering text documents using DBSCANscikit-learn:使用 DBSCAN 对文本文档进行聚类
【发布时间】:2014-10-02 17:37:19
【问题描述】:

我正在尝试使用 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 正常工作,或者我可能错过了什么。

【问题讨论】:

    标签: machine-learning scikit-learn cluster-analysis data-mining dbscan


    【解决方案1】:

    似乎支持 DBSCAN 的稀疏表示 as of Jan. 2015

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

    【讨论】:

      【解决方案2】:

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

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

      您需要找到不同的实现。可以试试ELKI的实现,速度很快,应该没有这个限制。

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

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

      【讨论】:

      • 引用荷马的话:“嗯嗯。嗯嗯。好的。嗯,你能重复一下你所说的关于......事情的那部分吗?呃......事情?” :)。我刚开始玩,试图遵循和理解这些例子。为了让事情顺利进行,暂时不要担心结果。我只是看不出我的设置和示例之间的区别。 X.shape 告诉 mit 它是一个 (832, 20932) 矩阵,它反映了我的 832 个文档和 20k+ 个不同的术语。但你是对的,当然,我需要更好地理解。我会看看ELKI。非常感谢!
      • 短故事:这不是 DBSCAN 限制,但可能是 scipy 限制。如果np.asarray(X).shape 返回一个元组,那么它不应该像上面那样失败。我没有使用足够的 numpy 来告诉你如何正确地将稀疏矩阵转换为密集矩阵。
      • 我发现了问题:矩阵X的预期格式在k-means和DBSCAN之间有所不同。虽然两者都需要一个 (n_sample, n_features) 矩阵,但 k-means 需要一个备用矩阵,而 DBSCAN 需要一个密集矩阵。因此,如果我在调用fit(X) 之前添加X=X.todense(),它会起作用。
      • 这就是我想说的。除了技术上 DBSCAN 不需要密集矩阵。这是 sklearn 版本,原因我不知道。
      • 是的,我不得不使用整个 numpy 矩阵概念。如果没有对 numpy 的深入了解,sklearn 文档就不直观。因此我的问题。非常感谢您的帮助,我会将您的答案标记为正确。
      猜你喜欢
      • 2015-03-09
      • 2019-04-15
      • 2017-03-22
      • 2016-03-17
      • 2016-05-16
      • 2015-12-19
      • 2017-08-08
      • 2012-12-30
      • 2019-12-25
      相关资源
      最近更新 更多