余弦相似度矩阵的奇异HDBScan聚类结果

时间:2019-09-19 06:19:15

标签: python cosine-similarity hdbscan

我正在尝试在机器日志文件中聚集类似的消息(例如,我不能忽略数字)。使用所有具有相同“ 相似度”的消息子集调试我的代码时,我遇到了一个非常奇怪的发现:在一定数量的这些消息下,HDBScan会产生预期的结果(即所有消息属于一个群集或不属于一个群集),但是在一定数量的消息之上,HDBScan突然开始寻找不同的群集,这从直觉上来说对我来说没有意义。

甚至更奇怪:我开始看到多个群集的限制是HDBScan中“ 通用”算法的18条消息,而使用“ 最佳”时为61条消息。好吧,也许“最佳”选择了60条以上的消息“ 通用”,不确定如何验证...

我尝试了min_cluster_sizemin_samples的各种设置以及各种距离度量,但是问题仍然相同。请在下面找到一些自包含的代码,以查看是否可以重现该问题。只需将n_msg更改为任何number >= 18(或在使用' best '时使用>=61),您将获得多个群集ID。该代码还打印了余弦相似度矩阵,因此您可以看到此示例的对称性。

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import hdbscan
import pandas as pd

# set number of dummy messages to be created
n_msg = 17

# create dummy messages with three identical and one variable term
msgs = pd.DataFrame()
for i in range(0, n_msg):
    msg = ['bli bla blub ' + str(i)]
    msgs = msgs.append(msg)
msgs.columns = ['msg']

# tokenizer to split at space only so numbers will not be ignored
def space_tokenizer(msg):
   return msg.split()

# Vectorize dummy messages
TFvectorizer = CountVectorizer(tokenizer = space_tokenizer)
msgs_vect = TFvectorizer.fit_transform(msgs.msg)

# Compute cosine similarity between message vectors
msgs_CosSim = pd.DataFrame(cosine_similarity(msgs_vect, msgs_vect))
print(msgs_CosSim,'\n')

# Cluster the cosine similarity results
hdbs = hdbscan.HDBSCAN(min_cluster_size=2, min_samples=1, metric='euclidean', \
                       algorithm='generic').fit(msgs_CosSim)
CosSim_clstr_ID = pd.DataFrame(hdbs.labels_)
CosSim_clstr_ID.columns = ['msg_ID']
print(CosSim_clstr_ID,'\n')

# Check number of cluster IDs generated
print('Number of cluster IDs:', len(CosSim_clstr_ID.msg_ID.unique()))

因此,再次使用以上这些虚拟消息,我希望得到与消息数量无关的相同结果(所有消息属于一个群集ID或异常群集-1),但我开始在一定数量的消息上方获得不同的群集(取决于HDBScan中的算法选择。)

知道发生了什么吗?

更新:仅使用allow_single_cluster=True(!)对此进行了更多研究,并遍历了所有algorithm值以及不同的消息类型(一到四个固定术语以及数字之间),在这里是'generic'虽然最快,但似乎最有可能随机产生奇怪结果的结果: enter image description here

0 个答案:

没有答案