Python 无监督学习聚类一维阵列

Python 无监督学习聚类一维阵列,python,scikit-learn,cluster-analysis,unsupervised-learning,Python,Scikit Learn,Cluster Analysis,Unsupervised Learning,我面临以下阵列: 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的问题,大多数问题都建议使用kmeans。尽管其他一些人提到kmeans对于1D阵列集群来说可能是一种过度的杀伤力。 然而,kmeans是一种监督学习算法,因此这意味着我必须传递质心的数量。因为我需要将这个问题推广到其他数组,

我面临以下阵列:

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的问题,大多数问题都建议使用kmeans。尽管其他一些人提到kmeans对于1D阵列集群来说可能是一种过度的杀伤力。 然而,kmeans是一种监督学习算法,因此这意味着我必须传递质心的数量。因为我需要将这个问题推广到其他数组,所以我无法传递每个数组的质心数。因此,我正在考虑实现某种无监督学习算法,这种算法能够自己计算出集群并选择最高的集群。 在数组y中,我将看到3个簇,分别为[1,2,4,7,9,5,4,7,9],[56,57,54,60],[200297275243]。 考虑到计算成本和准确性,什么算法最适合我的需要?我如何为我的问题实现它?

试试。来自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


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

另见:

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

      基本上,您所需要做的就是提供一个合理的
      min\u cluster\u size
      ,一个有效的距离
      metric
      ,您就可以开始了

      对于
      minu_cluster\u size
      我建议使用3,因为2的簇是跛脚的,而对于
      metric
      来说,默认的
      欧几里德
      非常有效,所以您甚至不需要提及它

      别忘了距离度量适用于向量,这里我们有标量,所以需要一些丑陋的重塑

      总而言之,假设“得分最高的集群”是指包含我们得到的最大值的集群:

      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)
      
      输出为
      [2972075 243]
      。原有秩序不被保留。这就是生活。

      在这里,集群是过度的 只需计算后续元素的差异。也就是说,看看
      x[I]-x[I-1]

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

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


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

      K-means本质上是一种无监督学习算法。您的数据不提供w/classes,因此k-means聚类算法用于对数据进行分类。本文可能会为您提供一些关于确定集群数量的见解:@MoxieBall的可能重复,它不一样。你有什么是监督,有3个集群设置我不认为提供的是最好的集群!是的,对不起,我必须改变这一点,Kmeans是一种无监督的学习算法;)那么,你会说MeanShift在计算大数据时比kmeans更有效吗?所以我试过了,它工作得很好,但是我现在面临的一个问题是它不能区分负值和正值。因此,从示例数组[-100,-20,-50,55,30,50],它会将-100视为最佳选项,这是不正确的,它实际上是最低的。这是否来自配件?@dre_84w934事实上是另一种情况:带minibatch的KMeans是可伸缩的,而10K是MeanShift的建议上限。聚类算法只告诉您聚类是什么。之后你必须找出“最高”一个。是的,我注意到了。但是,当值为负值时,如果-后面的数字大于正值,它将负值作为更高阶的批处理。我不认为在这里进行聚类是一种过分的做法,因为我无法手动确定阈值,因此我必须使用某种聚类算法来确定一个组中的最大值。对阈值进行一些简单的统计。比如三西格玛规则。做一些关于阈值的简单统计。比如三西格玛规则。相反,集群并不是没有参数的。为聚类选择参数是一个大问题!好的,就性能而言,您可能是对的,集群在这里可能是一种过度使用。然而,我认为它是无参数的,至少就我使用的目的而言。对于您的解决方案,我可能需要进行一些统计,这对于大容量数据来说是不可行的。最终,我使用这个算法从模糊匹配算法中筛选出较差的分数。由于我对2000行中的每一行都有20-30分,您可以看到为什么我更喜欢无参数的东西,即使这可能有点过分。集群几乎没有参数!这里有很多关于这个问题的问题。即使是最愚蠢的方法,k-means,也需要非常仔细的数据规范化(=许多隐藏参数),当然还有k。在这种方法中,您也可以选择k个最大差距,并且您可能会得到比使用k-means更好的结果。没有所谓的“最佳”聚类算法。