【问题标题】:How to cluster the values of a dict in Python?如何在 Python 中对 dict 的值进行聚类?
【发布时间】:2017-12-30 13:14:14
【问题描述】:

基本上,我在 Python 中有一个带有字符串键和整数数组作为值的 dict。

dict = {"Option1Results" : [4, 1, 5, 2, 4],
        "Option2Results" : [11, 44, 2, 1, 5],
        ....
        }

我想根据值的交集在这个字典上实现层次聚类。例如,假设 Option1Results 和 Option4Results 共享大约 70% 的相同整数,然后将它们聚集在一起。除了遍历字典并逐个比较值之外,还有其他方法吗?

【问题讨论】:

  • “将它们聚集在一起”是什么意思?这就是为什么强烈建议您在 SO 上展示您的最佳尝试,无论多么低效或蹩脚。您的代码通常使解释更容易。
  • 字典不是解决这个问题的正确选择。
  • 假设A[1,2,3,4]B[2,3,4,5]C[4,5,6,7]。根据您的标准,AB 会聚集,BC 会聚集,但 AC 不会聚集。你会怎么处理? tag for hierarchical-clustering 提到了一些聚类技术。你选了一个吗?您研究过聚类技术的算法吗?
  • 您可以使用简单的set 交集来确定两个列表的共同元素,即set(your_dict["Option1Results"]) & set(your_dict["Option4Results"])。然后你可以将它的长度与set 的总长度进行比较,以确定它们共有元素的百分比(例如float(len(set(entries["Option1Results"]) & set(entries["Option2Results"]))) / len(set(entries["Option1Results"]) | set(entries["Option2Results"])) * 100

标签: python python-2.7 dictionary hierarchical-clustering


【解决方案1】:

我认为您可以利用余弦相似度和 kmeans 两个函数

余弦相似度:

余弦相似度是衡量两个非零值之间的相似度 测量余弦的内积空间的向量 它们之间的角度。
https://en.wikipedia.org/wiki/Cosine_similarity

data = {'Option{}Results'.format(i):[ random.randint(1,100) for _ in range(5)] for i in range(100)}
pairwise.cosine_similarity(data.values()[0],data.values()[1])
array([[ 0.85988428]])

kmeans:

k-means clustering是一种向量量化的方法,最初来自 信号处理,在数据聚类分析中很流行 矿业。 k-means 聚类旨在将 n 个观察结果划分为 k 个 每个观测值都属于具有 最接近的均值,作为集群的原型。这导致一个 将数据空间划分为 Voronoi 单元。 https://en.wikipedia.org/wiki/K-means_clustering

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=5, random_state=0).fit(data.values())
kmeans.predict(data['Option70Results'])
array([2])

【讨论】:

    【解决方案2】:

    将给定dict的值作为集合查找交集:

    intersection = set.intersection(*map(set, dict.values())
    

    层次聚类可以使用scipy的linkage和fcluster来实现。这个answer解释了使用scipy的层次聚类。

    【讨论】:

      猜你喜欢
      • 2010-10-13
      • 2021-04-04
      • 2011-03-25
      • 2020-04-20
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 2018-02-25
      相关资源
      最近更新 更多