使用sklearn DBSCAN时,获得一个不太相似的集群是否正常?

时间:2017-07-15 00:44:22

标签: scikit-learn cluster-analysis dbscan

我有一大堆诊断代码序列,我试图根据相似性进行聚类。我通过使用最小公共子序列算法计算相似度然后从1减去相似性来找到每个序列之间的距离来创建距离矩阵。

然后我将那个距离矩阵传递给了sklearn的DBSCAN:

db = DBSCAN(eps=0.34, metric='precomputed')
db.fit(sim_mat)

创建群集后,我将每个群集中包含的序列输出到文本文件中。除了一个群集之外,每个群集对我都有意义。例如,这个集群对我来说很有意义,因为每个序列都有两个共同的代码并且顺序相同:

['345.3', '345.11']['345.3', '345.11', '038.9', '038.0', '276.51']['345.3', '345.11']['322.9', '345.3', '345.11']

然而,这个群集(此处缩写,因为它包含2852个序列)对我没有意义,因为没有一个序列有任何共同的代码:

['162.3', '038.9']['578.1', '584.9']['416.8', '486', '486', '038.11']['493.92', '428.0', '584.9', '427.89']['414.01', '998.59']

我的问题是,这是否是DBSCAN中的错误,或者我是否误解了如何使用它和/或它应该如何工作。此外,如果这是一个错误或算法的预期输出,还有另一个我应该考虑使用?

2 个答案:

答案 0 :(得分:1)

按照设计(DBSCAN中的字母N),该算法还可以识别属于任何群集的对象,称为 noise

如果你错误地对待"噪音"作为一个集群,它们当然看起来完全不相关。

某些样本通常不适合任何群集,因此这是一项功能,而非限制。您可以将每个点分配到与最近的聚簇点相同的聚类,但这不会提高聚类质量。

答案 1 :(得分:0)

我明白了。基于DBSCAN https://en.wikipedia.org/wiki/DBSCAN的描述,似乎这种行为是正常的。本质上,算法从一个项开始,在所需距离内找到它的邻居,然后继续为该簇中的每个点找到邻居。因此,您最终可能会得到一个实际上相距很远的点的群集。

为了解决这个问题,我选择使用Affinity Propagation - https://en.wikipedia.org/wiki/Affinity_propagation