【问题标题】:Clustering an array of values without using thresholds在不使用阈值的情况下对一组值进行聚类
【发布时间】:2020-09-01 13:01:08
【问题描述】:

我想将每个值代表一个错误的一维数据集分割成 2 段:

  • 具有最小值的集群
  • 所有其他

例子:

X = np.array([1, 1.5, 0.4, 1.1, 23, 24, 22.5, 21, 20, 25, 40, 50, 50, 51, 52, 53]).reshape(-1, 1)

在这个小例子中,我想重新组合集群中的前 4 个值,而忽略其他值。 我不想要基于阈值的解决方案。关键是感兴趣的聚类中心并不总是具有相同的值。可能是1e-6,也可能是1e-3,也可能是1

我的想法是使用 k-means 聚类算法,如果我知道我的数据中存在多少个聚类,它会很好地工作。在上面的例子中,数字是 3,一个在 1 左右(感兴趣的集群),一个在 22 左右,一个在 51 左右。但遗憾的是,我不知道集群的数量......简单地搜索 2 个集群不会导致按预期分割数据集。

kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
kmeans.labels_

返回一个过大 1 倍的集群,其中还包括以 22 为中心的集群中的数据。

array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0])

我确实在选择 k 的方法上找到了一些有趣的答案,但它使算法复杂化,我觉得必须有更好的方法来解决这个问题。

我愿意接受任何可以在所提供的X 数组上工作的建议和示例。

【问题讨论】:

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


    【解决方案1】:

    您可能会发现AffinityPropagation 在这里很有用,因为它不需要指定要生成的集群数量。但是,您可能需要调整 damping factorpreference,以便它产生预期的结果。

    在提供的示例中,默认参数似乎可以完成这项工作:

    from sklearn.cluster import AffinityPropagation
    
    X = np.array([1, 1.5, 0.4, 1.1, 23, 24, 22.5, 
                  21, 20, 25, 40, 50, 50, 51, 52, 53]).reshape(-1, 1)
    ap = AffinityPropagation(random_state=12).fit(X)
    y = ap.predict(X)
    print(y)
    # array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2], dtype=int64)
    

    要从X 获取单个集群,您可以使用y 进行索引:

    first_cluster = X[y==0].ravel()
    first_cluster
    # array([1. , 1.5, 0.4, 1.1])
    second_cluster = X[y==1].ravel()
    second_cluster
    # array([23. , 24. , 22.5, 21. , 20. , 25. ])
    

    【讨论】:

    • 谢谢,这看起来很有希望。调查一下!
    猜你喜欢
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 2012-01-26
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    相关资源
    最近更新 更多