使用sklearn中的轮廓得分对k-means算法进行高效评估

2024-04-28 04:35:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在对大约100万个项目(每个项目表示为大约100个特征向量)运行k-means聚类。我已经为不同的k运行了聚类,现在想用sklearn中实现的剪影评分来评估不同的结果。尝试在没有采样的情况下运行它似乎是不可行的,并且需要很长的时间,因此我假设我需要使用采样,即:

metrics.silhouette_score(feature_matrix, cluster_labels, metric='euclidean',sample_size=???)

然而,我对什么是适当的抽样方法没有很好的理解。在给定矩阵大小的情况下,使用多大的样本有经验法则吗?是取我的分析机器能处理的最大样本,还是取更多较小样本的平均值?

我这么问很大程度上是因为我的初步测试(样本量=10000)产生了一些非常不直观的结果。

我也对其他更具可伸缩性的评估指标持开放态度。


编辑以使问题可视化:对于不同的样本大小,图中显示的剪影分数是集群数量的函数enter image description here

不奇怪的是,增加样本量似乎可以减少噪音。奇怪的是,假设我有100万个非常异质的向量,那么2或3是“最好的”簇数。换言之,不直观的是,当我增加簇的数量时,我会发现剪影分数或多或少单调地减少。


Tags: 项目数量时间情况聚类sklearn评分分数
3条回答

kmeans收敛到局部极小值。起始位置对簇的最佳数目起着至关重要的作用。通常使用PCA或任何其他降维技术来处理kmeans来降低噪声和维数是一个好主意。

只是为了完整起见。通过“围绕medods划分”来获得最佳簇数可能是一个好主意。它相当于使用轮廓法。

奇怪的观察结果的原因可能是不同大小样本的起点不同。

综上所述,评估现有数据集的可聚类性是很重要的。可处理的平均数是由这里讨论的最坏配对比Clusterability

其他指标

  1. 肘部法:计算每个K的解释方差百分比,然后选择曲线图开始平缓的K。(这里有一个很好的描述https://en.wikipedia.org/wiki/Determining_the_number_of_clusters_in_a_data_set)。显然,如果你有k==数据点的数量,你可以解释100%的方差。问题是,解释的方差改进从哪里开始趋于平稳。

  2. 信息论:如果你能计算出一个给定K的可能性,那么你可以使用AIC,AICc,或BIC(或任何其他信息论方法)。E、 对于AICc,它只是平衡了当你增加K时可能性的增加和你需要的参数数量的增加。实际上,你所要做的就是选择最小化AICc的K。

  3. 通过运行其他方法(比如DBSCAN),您可能会对大致合适的K有一种感觉,这些方法可以为您提供集群数量的估计值。虽然我还没有看到用这种方法来估计K,而且像这样依赖它可能是不可取的。但是,如果DBSCAN在这里也给了您少量的集群,那么您的数据可能有一些您可能不欣赏的地方(即,没有您期望的集群那么多)。

取样量

看起来你已经从你的情节中回答了这个问题:无论你的样本是什么,你在剪影得分中得到的模式都是一样的。因此,这种模式对抽样假设似乎非常稳健。

其他指标

  1. 肘部法:计算每个K的解释方差百分比,然后选择曲线图开始平缓的K。(这里有一个很好的描述https://en.wikipedia.org/wiki/Determining_the_number_of_clusters_in_a_data_set)。显然,如果你有k==数据点的数量,你可以解释100%的方差。问题是,解释的方差改进从哪里开始趋于平稳。

  2. 信息论:如果你能计算出一个给定K的可能性,那么你可以使用AIC,AICc,或BIC(或任何其他信息论方法)。E、 对于AICc,它只是平衡了当你增加K时可能性的增加和你需要的参数数量的增加。实际上,你所要做的就是选择最小化AICc的K。

  3. 通过运行其他方法(比如DBSCAN),您可能会对大致合适的K有一种感觉,这些方法可以为您提供集群数量的估计值。虽然我还没有看到用这种方法来估计K,而且像这样依赖它可能是不可取的。但是,如果DBSCAN在这里也给了您少量的集群,那么您的数据可能有一些您可能不欣赏的地方(即,没有您期望的集群那么多)。

取样量

看起来你已经从你的情节中回答了这个问题:无论你的样本是什么,你在剪影得分上得到的模式都是一样的。因此,这种模式对抽样假设似乎非常稳健。

相关问题 更多 >