无监督学习聚类一维数组

时间:2018-07-23 21:38:50

标签: python scikit-learn cluster-analysis unsupervised-learning

我面临以下数组:

<input type="hidden" name="tags" value=".30, .31, .6, .38"> 

我想做的是提取得分最高的集群。那将是

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

我已经检查了很多与此主题有关的问题,其中大多数建议使用kmeans。尽管还有其他一些人提到kmeans对于一维数组集群可能是一个过大的杀伤力。 但是kmeans是一种有监督的学习算法,因此这意味着我必须输入质心的数量。由于我需要将此问题推广到其他数组,因此我无法传递每个数组的质心数。因此,我正在研究实现某种无监督的学习算法,该算法将能够自己找出集群并选择最高的集群。 在数组y中,我将看到3个簇,即[1,2,4,7,9,5,4,7,9],[56,57,54,60],[200,297,275,243]。 考虑到计算成本和准确性,哪种算法最能满足我的需求,以及如何针对我的问题实施该算法?

3 个答案:

答案 0 :(得分:1)

尝试MeanShift。从MeanShift的user guide字样开始:

  

该算法自动设置簇数,...

修改后的演示代码:

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不能随样本数量扩展。建议的上限是10,000。


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

另请参阅:

答案 1 :(得分:0)

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

基本上,您所需要做的就是提供合理的min_cluster_size,有效距离metric,然后您就可以正常了。

对于min_cluster_size,我建议使用3,因为2的簇是la脚的,而对于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]。原始订单未保留。 C'est la vie

答案 2 :(得分:0)

在这里聚簇 是过分的

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

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

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

在一维有序数据上,任何不使用该顺序的方法都将比必需的慢。