为了账号安全,请及时绑定邮箱和手机立即绑定

不使用阈值对值数组进行聚类

不使用阈值对值数组进行聚类

小怪兽爱吃肉 2023-07-11 10:39:58
我想将每个值代表一个错误的一维数据集分成 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 均值聚类算法,如果我确实知道数据中存在多少个聚类,该算法就会很好地工作。在上面的例子中,数字是 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所提供的数组上工作的建议和示例。
查看完整描述

1 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

您可能会发现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. ])


查看完整回答
反对 回复 2023-07-11
  • 1 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信