在不使用阈值的情况下对值数组进行聚类

问题描述

我想将一个一维数据集分割成两个部分:

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

示例:

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

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

我的想法是使用k均值聚类算法,如果我确实知道数据中存在多少个聚类,该算法将很好地工作。在上面的示例中,该数字为3,一个围绕1(感兴趣的簇),一个围绕22,一个围绕51。但是可悲的是,我不知道簇的数量……仅搜索2个簇就不会导致按预期分割数据集。

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

以太大的方式返回集群1,其中也包括以22为中心的集群数据。

array([1,1,0])

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

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

解决方法

您可能会发现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,51,52,53]).reshape(-1,1)
ap = AffinityPropagation(random_state=12).fit(X)
y = ap.predict(X)
print(y)
# array([0,1,2,2],dtype=int64)

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...