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

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

然而,我不清楚什么是合适的抽样方法。对于给定矩阵大小的样本,是否有一个经验法则?是最好采取我的分析机能处理的最大样本,还是采取更多较小样本的平均值?
我之所以问这个问题,很大程度上是因为我的初步测试(样本大小=10000)产生了一些非常不具说服力的结果。
我也愿意接受其他更具可扩展性的评估指标。
编辑以可视化问题:绘图显示,对于不同的样本大小,轮廓分数是集群数量的函数
不奇怪的是,增加样本量似乎可以减少噪音。奇怪的是,假设我有100万个非常异质的载体,那么2或3个是集群的“最佳”数量。换句话说,当我增加集群的数量时,我会发现轮廓分数或多或少单调地减少。

最佳答案

其他指标
肘形法:计算每k的方差百分比,并选择绘图开始变平的k。(这里有一个很好的描述)。显然,如果你有k==数据点的个数,你可以解释100%的方差。问题是,解释的方差改进从哪里开始趋于平稳。
信息理论:如果你能计算出给定k的可能性,那么你可以使用aic、aicc或bic(或任何其他信息理论方法)。例如,对于AICC,它只是在增加k时的可能性增加与所需参数数量的增加之间进行平衡。实际上,你所要做的就是选择K,使AICC最小化。
通过运行其他方法(比如dbscan),您可能会对大致合适的k有一种感觉,这些方法会返回集群数量的估计值。虽然我还没有看到这种方法用于估算K,但是像这样依赖它可能是不可取的。但是,如果dbscan在这里也为您提供了少量集群,那么您的数据可能有一些您可能不喜欢的地方(即,您所期望的集群不多)。
样品多少钱
看起来你已经从你的情节中回答了这个问题:不管你的样本是什么,你都会得到相同的轮廓分数模式。因此,对于抽样假设,这种模式似乎非常强大。

关于python - 在sklearn中使用轮廓分数进行高效的k-means评估,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23687247/

10-12 16:37