无监督学习聚类1D阵列



我面临以下数组:

y = [1,2,4,7,9,5,4,7,9,56,57,54,60,200,297,275,243]

我想做的是提取得分最高的聚类。那就是

best_cluster = [200,297,275,243]

我已经检查了很多关于这个主题的stack问题,其中大多数都建议使用kmean。尽管其他一些人提到,对于1D阵列集群来说,kmean可能是一种过度使用。然而,kmeans是一种监督学习算法,因此这意味着我必须输入质心的数量。由于我需要将这个问题推广到其他数组,我无法传递每个数组的质心数。因此,我正在考虑实现某种无监督学习算法,该算法能够自己计算出聚类并选择最高的聚类。在数组y中,我会看到3个簇,如[1,2,4,7,9,5,4,7,9],[56,7,54,60],200297275243]。考虑到计算成本和准确性,什么算法最适合我的需求?我如何针对我的问题实现它?

尝试MeanShift。来自MeanShift:的sklean用户指南

算法自动设置簇的数量。。。

修改的演示代码:

import numpy as np
from sklearn.cluster import MeanShift, estimate_bandwidth
# #############################################################################
# Generate sample data
X = [1,2,4,7,9,5,4,7,9,56,57,54,60,200,297,275,243]
X = np.reshape(X, (-1, 1))
# #############################################################################
# Compute clustering with MeanShift
# The following bandwidth can be automatically detected using
# bandwidth = estimate_bandwidth(X, quantile=0.2, n_samples=100)
ms = MeanShift(bandwidth=None, bin_seeding=True)
ms.fit(X)
labels = ms.labels_
cluster_centers = ms.cluster_centers_
labels_unique = np.unique(labels)
n_clusters_ = len(labels_unique)
print("number of estimated clusters : %d" % n_clusters_)
print(labels)

输出:

number of estimated clusters : 2
[0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1]

请注意,MeanShift是,而不是可随样本数伸缩。建议的上限为10000。


BTW,正如rahlf23已经提到的,K-mean是一种无监督学习算法。您必须指定集群数量这一事实并不意味着它受到监督。

另请参阅:

  • 聚类方法概述

  • 选择正确的估计器

聚类在这里是过度的

只需计算后续元素的差异。即看x[i]-x[i-1]

选择k最大差异作为分割点。或者定义何时拆分的阈值。例如20。取决于您的数据知识。

这是O(n(,比所有其他提到的都快得多。也很容易理解和预测。

对于一维有序数据,任何不使用该顺序的方法都会比必要的慢。

HDBSCAN是最好的聚类算法,您应该始终使用它。

基本上,你所需要做的就是提供一个合理的min_cluster_size,一个有效的距离metric,你就可以出发了。

对于min_cluster_size,我建议使用3,因为2的集群是蹩脚的,而对于metric,默认的euclidean工作得很好,所以你甚至不需要提及它

不要忘记,距离度量适用于向量,这里有标量所以需要进行一些丑陋的整形。

把所有这些放在一起,假设"得分最高的集群",你指的是包括我们得到的最大值的集群:

from hdbscan import HDBSCAN
import numpy as np
y = [1,2,4,7,9,5,4,7,9,56,57,54,60,200,297,275,243]
y = np.reshape(y, (-1, 1))
clusterer = HDBSCAN(min_cluster_size=3)
cluster_labels = clusterer.fit_predict(y)
best_cluster = clusterer.exemplars_[cluster_labels[y.argmax()]].ravel()
print(best_cluster)

输出为[297 200 275 243]。原始订单不保留<这就是生活。>

最新更新