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更好的结果。没有所谓的“最佳”聚类算法。