k-fold交叉验证用于确定k-means中的k值?

在文档聚类过程中,作为数据预处理步骤,我首先应用奇异值分解获得USVt,然后通过选择合适数量的特征值,我截断了Vt,根据这里的阅读,这让我获得了良好的文档-文档相关性。现在,我正在对矩阵Vt的列进行聚类,以将相似的文档聚集在一起,为此我选择了k-means,初始结果对我来说看起来是可以接受的(k = 10个聚类),但我想更深入地研究选择k值本身。为了确定k-means中的聚类数量k,我被建议考虑使用交叉验证。

在实施之前,我想弄清楚是否有使用numpy或scipy的内置方法来实现这一点。目前,我执行kmeans的方式是简单地使用scipy中的函数。

import numpy, scipy# 对数据进行预处理并计算svdU, S, Vt = svd(A) # A是原始词-文档矩阵的TFIDF表示# 从Vt获得文档-文档相关性# 这个50是检查S的scree图后获得的阈值docvectors = numpy.transpose(self.Vt[0:50, 0:]) # 准备数据以运行k-meanswhitened = whiten(docvectors)res, idx = kmeans2(whitened, 10, iter=20)

假设到目前为止我的方法是正确的(如果我遗漏了某些步骤,请纠正我),在这一阶段,使用输出进行交叉验证的标准方法是什么?关于如何将此应用于k-means的任何参考/实现/建议将不胜感激。


回答:

要运行k-fold交叉验证,你需要一些质量度量来优化。这可以是分类度量,如准确率或F1,也可以是专门的度量,如V-measure

即使我知道的聚类质量度量也需要标记数据集(“真实情况”)才能工作;与分类不同的是,你只需要部分数据被标记用于评估,而k-means算法可以利用所有数据来确定中心点,从而确定聚类。

V-measure和其他几个评分在scikit-learn中都有实现,同时还有通用的交叉验证代码和一个“网格搜索”模块,该模块根据指定的评估度量使用k-fold CV进行优化。免责声明:我参与了scikit-learn的开发,尽管我没有编写提到的任何代码。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注