22

我正在尝试使用 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)这里在做什么,但是在 command 之后X.shape = ()。因此X.shape[0],炸弹——之前,X.shape[0]正确地指的是文件的数量。出于好奇,我X = np.asarray(X)dbscan_.py. 当我这样做时,某些东西正在大量计算。但几秒钟后,我收到另一个错误:

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

4

2 回答 2

15

截至 2015 年 1 月,似乎支持 DBSCAN 的稀疏表示。

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

于 2015-10-27T19:02:08.413 回答
7

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

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

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

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

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

于 2014-08-09T10:01:47.480 回答