scikit-学习如何知道集群中的文档?

时间:2013-07-22 13:07:05

标签: python cluster-analysis scikit-learn k-means

我是python和scikit-learn的新手所以请耐心等待。

我从k means clustering.

获取了k意味着聚类算法的源代码

然后我使用load_file函数修改为在本地集上运行。

虽然算法终止,但它不会产生任何输出,例如哪些文档聚集在一起。

我发现km对象有“km.label”数组,列出了每个文档的质心id。

它还具有带有“km.cluster_centers _”

的质心向量

但它是什么文件?我必须将它映射到“数据集”,这是一个“束”对象。

如果我打印dataset.data [0],我会得到第一个文件的数据,我认为这些数据是洗牌的。但我只是想知道这个名字。

我对像问题这样的问题感到困惑。在km.label [0],dataset.data [0]上的文档是否已集中到centoid?

我的基本问题是找到哪些文件聚集在一起。 如何找到?

2 个答案:

答案 0 :(得分:12)

忘记Bunch对象。这只是一个实现细节,用于加载与scikit-learn捆绑在一起的玩具数据集。

在现实生活中,您需要直接打电话给实际数据:

km = KMeans(n_clusters).fit(my_document_features)

然后从以下位置收集群集分配:

km.labels_

my_document_features是一个2D数据结构:numpy数组或形状为(n_documents, n_features)的scipy.sparse矩阵。

km.labels_是形状为(n_documents,)的1D numpy数组。因此labels_中的第一个元素是my_document_features特征矩阵第一行中描述的文档的聚类索引。

通常,您会使用my_document_features对象构建TfidfVectorizer

my_document_features = TfidfVectorizer().fit_transform(my_text_documents)

my_text_documents如果您直接读取文档(例如来自数据库或来自单个CSV文件的行或任何您想要的内容),则可以是列表python unicode对象,或者:

vec = TfidfVectorizer(input='filename')
my_document_features = vec.fit_transform(my_text_files)

其中my_text_files是硬盘上文档文件路径的python列表(假设它们使用UTF-8编码进行编码)。

my_text_filesmy_text_documents列表的长度应为n_documents,因此与km.labels_的映射是直接的。

由于scikit-learn不仅仅用于聚类或分类文档,我们使用名称“sample”而不是“document”。这样您就可以看到我们使用n_samples而不是n_documents来记录库中所有估算器的参数和属性的预期形状。

答案 1 :(得分:2)

dataset.filenames是关键:)

这就是我做到的。

load_files声明是:

def load_files(container_path, description=None, categories=None,
           load_content=True, shuffle=True, charset=None,
           charse_error='strict', random_state=0)

所以

dataset_files = load_files("path_to_directory_containing_category_folders");

然后当我得到结果时:

我将它们放在群集中,这是一个字典

clusters = defaultdict(list)

k = 0;
for i in km.labels_ :
  clusters[i].append(dataset_files.filenames[k])  
  k += 1

然后我打印它:)

for clust in clusters :
  print "\n************************\n"
  for filename in clusters[clust] :
    print filename