为啥所有标签_都是-1?由 DBSCAN 在 Python 中生成

Posted

技术标签:

【中文标题】为啥所有标签_都是-1?由 DBSCAN 在 Python 中生成【英文标题】:Why are all labels_ are -1? Generated by DBSCAN in Python为什么所有标签_都是-1?由 DBSCAN 在 Python 中生成 【发布时间】:2020-05-03 15:39:31 【问题描述】:

![在此处输入图片描述][1]

from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=0.001, min_samples=10) 
clustering = dbscan.fit(X)

示例向量:

array([[ 0.05811029, -1.089355  , -1.9143777 , ...,  1.235167  ,
    -0.6473859 ,  1.5684978 ],
   [-0.7117326 , -0.31876346, -0.45949244, ...,  0.17786546,
     1.9377285 ,  2.190525  ],
   [ 1.1685177 , -0.18201494,  0.19475089, ...,  0.7026453 ,
     0.3937522 , -0.78675956],
   ...,
   [ 1.4172379 ,  0.01070347, -1.3984257 , ..., -0.70529956,
     0.19471683, -0.6201791 ],
   [ 0.6171041 , -0.8058429 ,  0.44837445, ...,  1.216958  ,
    -0.10003573, -0.19012968],
   [ 0.6433722 ,  1.1571665 , -1.2123466 , ...,  0.592805  ,
     0.23889546,  1.6207514 ]], dtype=float32)

X是model.wv.vectors,由model = word2vec.Word2Vec(sent, min_count=1,size= 50,workers=3, window =3, sg = 1)生成

结果如下:

数组([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 , -1, -1, -1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1 , -1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1 , -1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1 , -1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1 , -1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1 , -1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1 , -1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1 , -1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1 , -1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1 , -1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1 , -1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1 , -1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1 , -1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1 , -1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1 , -1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1 , -1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1 , -1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1 , -1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1 , -1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1 , -1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1、-1 , -1, -1, -1, -1, -1, -1])

【问题讨论】:

如果人们无法复制代码,他们将很难回答您的问题。您可以从图像中获取代码并在此处对其进行格式化。此外,如果您有一些示例数据,您可以提供这将有助于我们与您一起解决问题。 @lwileczek 我只是不知道如何在这里编写代码。 你能显示实际输出-1 值数组的代码吗?此外,根据DBSCAN 文档,它旨在为不在任何“高密度”集群中的“嘈杂”样本返回-1。您的词向量可能分布得如此均匀,没有“高密度”集群。 (您从哪些数据中训练词向量,以及词向量集有多大?您是否通过其他检查验证了词向量是否合理/有用?) 您可能需要为您的数据调整 DBSCAN 参数。而且,对单位长度规范的词向量而不是原始幅度向量进行操作可能是有意义的。 (执行model.wv.init_sims(),然后使用model.wv.vectors_norm 而不是model.wv.vectors。)最后,min_count=1 通常会导致比更高的min_count 值更差的词向量,后者会丢弃很少使用示例的单词。稀有词无法获得强向量,并且将它们保持在训练中也会干扰其他更频繁词向量的改进。 @gojomo 显示带有 clustering.labels_ 的数组。我稍后会尝试你的建议~谢谢。 【参考方案1】:

基于docs:

labels_array, shape = [n_samples]

Cluster labels for each point in the dataset given to fit(). Noisy samples are given the label -1.

您可以在这里找到答案:What are noisy samples in Scikit's DBSCAN clustering algorithm?

简而言之:它们不完全是集群的一部分。它们只是不属于任何集群的点,可以在某种程度上“忽略”。 看来您的数据确实不同,它们没有中心聚类类。

你可以尝试什么?

DBSCAN(eps=0.5, min_samples=5, metric='euclidean', metric_params=None, algorithm='auto', leaf_size=30, p=None, n_jobs=None)

您可以使用参数或更改聚类算法吗?你试过kmeans吗?

【讨论】:

我试过你的,它更好。但还不够好,结果是 -1 和 0。我曾尝试使用 Kmeans,效果很好。我很好奇为什么会存在这种差异。【参考方案2】:

您的 eps 值为 0.001;尝试增加它以便形成集群(否则每个点都将被视为异常值/标记为 -1,因为它不在集群中)

【讨论】:

以上是关于为啥所有标签_都是-1?由 DBSCAN 在 Python 中生成的主要内容,如果未能解决你的问题,请参考以下文章

使用 python 和 scikit-learn 的 DBSCAN:make_blobs 返回的整数标签到底是啥?

python DBSCAN.py

python DBSCAN.py

为啥 Django 应用程序需要 `manage.py` 而不是使用 `__init__ py`?

写给自己看的DBSCAN:基本实现

数据挖掘算法:DBSCAN算法的C++实现