【问题标题】:scikit-learn how to know documents in the cluster?scikit-learn 如何知道集群中的文档?
【发布时间】:2013-07-21 05:43:26
【问题描述】:

我是 python 和 scikit-learn 的新手,所以请多多包涵。

我从k means clustering.获取了这个k均值聚类算法的源代码

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

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

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

它也有带有“km.cluster_centers_”的质心向量

但它是什么文件?我必须将它映射到作为“Bunch”对象的“数据集”。

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

我对诸如 dataset.data[0] 处的文档是否聚集到 km.label[0] 处的质心之类的问题感到困惑?

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

【问题讨论】:

  • 确保验证结果是否合理。 K-means 通常会返回可能是数学最优值的结果,但对手头的实际问题毫无用处!

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


【解决方案1】:

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

【讨论】:

  • 这帮助我弄清楚如何显示哪些观察属于非文件数据集的每个集群。谢谢!
【解决方案2】:

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

在现实生活中,您只需直接调用真实数据即可:

km = KMeans(n_clusters).fit(my_document_features)

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

km.labels_

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

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

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

my_document_features = TfidfVectorizer().fit_transform(my_text_documents)

如果您直接读取文档(例如从数据库或单个 CSV 文件中的行或您想要的任何内容),my_text_documents 将列出 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 来记录库中所有估计器的参数和属性的预期形状。

【讨论】:

  • 感谢 ogrisel。在示例代码中 dataset.data 是您的“my_text_files”。那么如何找到索引为 0 的文件呢?如果它不存储它,我如何在使用 load_files() 函数时获取文件名?
  • 否:dataset.data 是包含文本文件内容的内存中 python unicode 字符串列表。如果您使用load_files() 实用程序,则filenames 存储在dataset.filenames 列表中。
猜你喜欢
  • 2017-09-19
  • 2017-11-25
  • 2016-07-15
  • 2015-04-05
  • 2018-10-11
  • 2018-10-24
  • 2015-08-14
  • 2016-04-12
  • 2020-06-27
相关资源
最近更新 更多