如何在基于密度的聚类中获取属于其聚类的文档?

Posted

技术标签:

【中文标题】如何在基于密度的聚类中获取属于其聚类的文档?【英文标题】:How to obtain the documents that belongs to its cluster in density based clustering? 【发布时间】:2019-11-13 08:44:19 【问题描述】:

我对文本文档使用 DBSCAN 聚类如下, 感谢this post。

db = DBSCAN(eps=0.3, min_samples=2).fit(X)
core_samples_mask1 = np.zeros_like(db1.labels_, dtype=bool)
core_samples_mask1[db1.core_sample_indices_] = True
labels1 = db1.labels_

现在我想看看哪个文档属于哪个集群,比如:

[I have a car and it is blue] belongs to cluster0

idx [112] belongs to cluster0

与我在here 中提出的问题类似,但我已经测试了那里提供的一些答案:

X[labels == 1,:]

我得到了:

array([[0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0]], dtype=int64)

但这对我没有帮助。如果您有任何建议或方法,请告诉我。

【问题讨论】:

【参考方案1】:

如果您有一个带有 idxmessages 列的 pandas 数据框 df,那么您所要做的就是

df['cluster'] = db.labels_

为了获得具有集群成员资格的新列cluster

这是一个带有虚拟数据的简短演示:

import numpy as np
import pandas as pd
from sklearn.cluster import DBSCAN

X = np.array([[1, 2], [5, 8], [2, 3],
               [8, 7], [8, 8], [2, 2]])

db = DBSCAN(eps=3, min_samples=2).fit(X)
db.labels_
# array([0, 1, 0, 1, 1, 0], dtype=int64)

# convert our numpy array to pandas:
df = pd.DataFrame('Column1':X[:,0],'Column2':X[:,1])
print(df)
# result:
   Column1  Column2
0        1        2
1        5        8
2        2        3
3        8        7
4        8        8
5        2        2

# add new column with the belonging cluster:
df['cluster'] = db.labels_

print(df)
# result:
   Column1  Column2  cluster
0        1        2        0
1        5        8        1
2        2        3        0
3        8        7        1
4        8        8        1
5        2        2        0  

【讨论】:

@Bilgin 对 DBSCAN 本身知之甚少(从未使用过它),此外,对于 SO 来说,这可能是一个离题的问题(如果我知道的话,我不会回答当然),这是关于编码问题。 ML 方法问题应发送至Cross Validated。

以上是关于如何在基于密度的聚类中获取属于其聚类的文档?的主要内容,如果未能解决你的问题,请参考以下文章

DBSCAN聚类算法原理总结

聚类:层次聚类基于划分的聚类(k-means)基于密度的聚类基于模型的聚类

用于在 KMeans 聚类中选择适当数量的聚类的轮廓索引

聚类算法--DBSCAN

简单易学的机器学习算法——基于密度的聚类算法DBSCAN

高维数据的聚类小记