在不使用阈值的情况下对一组值进行聚类
Clustering an array of values without using thresholds
我想将每个值代表一个错误的一维数据集分割成 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_
Returns 集群 1 太大了,其中还包括以 22 为中心的集群的数据。
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0])
我确实找到了一些关于 select k 方法的有趣答案,但它使算法变得复杂,我觉得必须有更好的方法来解决这个问题。
我愿意接受任何可以对所提供的 X
数组起作用的建议和示例。
您可能会发现 AffinityPropagation
在这里很有用,因为它不需要指定要生成的簇的数量。但是,您可能需要调整 damping factor
和 preference
,以便它产生预期的结果。
在提供的示例中,默认参数似乎可以完成工作:
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. ])
我想将每个值代表一个错误的一维数据集分割成 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_
Returns 集群 1 太大了,其中还包括以 22 为中心的集群的数据。
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0])
我确实找到了一些关于 select k 方法的有趣答案,但它使算法变得复杂,我觉得必须有更好的方法来解决这个问题。
我愿意接受任何可以对所提供的 X
数组起作用的建议和示例。
您可能会发现 AffinityPropagation
在这里很有用,因为它不需要指定要生成的簇的数量。但是,您可能需要调整 damping factor
和 preference
,以便它产生预期的结果。
在提供的示例中,默认参数似乎可以完成工作:
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. ])