0

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

更奇怪的是:我开始看到多个集群的限制是HDBScan中“通用”算法的 18 条消息,但使用“最佳”时为 61 条消息。好吧,也许 'best' 选择 ' generic ' 超过 60 条消息,不知道如何验证...

我已经尝试了各种设置min_cluster_sizemin_samples各种距离指标,但问题仍然存在。请在下面找到一些独立的代码,看看您是否可以重现该问题。只需更改n_msg为任何number >= 18(或>=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',虽然是最快的,但似乎是最有可能随机产生奇怪的结果: 在此处输入图像描述

4

0 回答 0