【问题标题】:Clustering of documents with it's structure使用其结构对文档进行聚类
【发布时间】:2020-08-29 13:33:49
【问题描述】:

我正在通过查看文档的结构来对文档进行聚类。

我在下面的代码中提取了 BERT 嵌入变量 X 中的结构。

我正在尝试什么:

for num_clusters in np.arange(2,200):
    model = KMeans(n_clusters=num_clusters)
    model.fit(X)
    pred = model.predict(X)
    centers = model.cluster_centers_

    cluster_sum = 0
    for i , c in enumerate(centers):
        use = []
        for j , p in enumerate(pred):
            if p == i:
                use.append(X[j])
        score = 0
        for m in range(len(use)):
            for n in range(len(use)):
                score+=cos_similarity(use[m],use[n])
        score = score/(len(use)*len(use))
        cluster_sum += score
    cluster_sum=cluster_sum/num_clusters

我编写了这段代码来查找集群的相似度分数(结合所有集群的相似度分数)。 我面临的问题: 随着聚类数量的增加,得分也在增加。

如何找到最佳聚类数? 该图适用于@Cyrus 在答案中建议的膝关节算法。我看不到我应该在哪里画线。

【问题讨论】:

    标签: python machine-learning cluster-analysis k-means unsupervised-learning


    【解决方案1】:

    有很多主题可以为您指明正确的方向。 你可以看看一些像:

    1. 肘部法
    2. 剪影分析
    3. 不依赖于预先给出集群数量的不同类型的聚类算法(例如 DBSCAN)

    希望这会有所帮助!

    【讨论】:

    • Manish Prasad,详情请见 Google。请输入 - (如何在 k-means 中找到最佳集群?) - 您将获得多个可以研究的主题。
    【解决方案2】:

    我的回答更多地解决了您问题的数学方面:

    sklearnKMeans的实现使用欧几里得距离来衡量输入数据中数据点之间的相异程度。但是,您似乎正在尝试使用余弦相似度来评估聚类质量 - 已针对不同的距离度量聚类结果进行了优化。这可以解释集群分数随着集群数量的增加而增加的原因。

    您是否注意到KMeans 具有inertia_ 属性,它对应于样本到其最近聚类中心的距离平方和;这可以被视为使用欧几里得距离的KMeans 的有效聚类分数。

    如果这对你有帮助,我很高兴!

    【讨论】:

    • 使用欧几里得距离来创建分数对我有任何帮助吗?这是我用于聚类的 Bert 嵌入。
    • 我尝试使用欧几里得距离来计算分数..随着聚类中心数量的增加,分数几乎连续下降。
    • KMeans 您正在使用的实现不能使用除欧几里得距离之外的任何其他东西,并且合适的分数记录在inertia_ 中。您可以将 KMeans 用于 Bert 嵌入,但请注意在高维空间中使用 Curse of dimensionality。欧几里得距离对它相当敏感。
    猜你喜欢
    • 2014-10-02
    • 2018-02-21
    • 2016-01-25
    • 1970-01-01
    • 2013-06-08
    • 2015-05-13
    • 2019-01-06
    • 2015-03-09
    • 2012-09-11
    相关资源
    最近更新 更多