5

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

我从k 意味着聚类中获取了 k 意味着聚类算法的源代码。

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

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

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

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

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

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

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

我的基本问题是找到哪些文件聚集在一起。怎么找到那个?

4

2 回答 2

12

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

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

km = KMeans(n_clusters).fit(my_document_features)

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

km.labels_

my_document_features是一个 2D 数据结构:一个 numpy 数组或一个 scipy.sparse 矩阵与 shape (n_documents, n_features)

km.labels_是一个形状为 的一维 numpy 数组(n_documents,)。因此,第一个元素是特征矩阵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)

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

my_text_filesor列表的长度my_text_documents应该是直接n_documents的映射km.labels_

由于 scikit-learn 不仅仅用于对文档进行聚类或分类,因此我们使用名称“sample”而不是“document”。这是您将看到我们使用n_samples而不是n_documents记录库中所有估计器的参数和属性的预期形状的方式。

于 2013-07-22T14:49:25.180 回答
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
于 2013-07-23T05:20:11.577 回答