理解scikit-learn KMeans

时间:2015-09-03 08:23:38

标签: python scikit-learn k-means

我在一组文本文档(大约100个)上应用了聚类。我使用Tfidf将它们转换为TfIdfVectorizer向量,并将向量作为输入提供给scikitlearn.cluster.KMeans(n_clusters=2, init='k-means++', max_iter=100, n_init=10)。现在,当我

model.fit()
print model.score()

在我的向量上,如果所有文本文档非常相似,我会得到一个非常小的值,如果文档非常不同,我得到一个非常大的负值。

它的基本目的是找到哪些文档类似,但是有人可以帮助我理解这个model.score()值究竟是什么意思?如何使用此值来证明我的发现?

3 个答案:

答案 0 :(得分:8)

在文档中说:

Returns:    
score : float
Opposite of the value of X on the K-means objective.

要理解这意味着您需要查看k-means算法。 k-means基本上做的是找到最小化数据样本及其相关集群中心之间距离总和的集群中心。

这是一个两步过程,其中(a)每个数据样本与其最近的聚类中心相关联,(b)聚类中心被调整为位于与它们相关的所有样本的中心。重复这些步骤,直到满足标准(最后两次迭代之间的最大迭代次数/最小值变化)。

正如您所看到的,数据样本与其关联的聚类中心之间仍然存在距离,而我们最小化的目标是距离(所有距离的总和)。

如果您的数据样本种类繁多,如果数据样本的数量明显高于群集数量(在您的情况下仅为 2 ),则自然会获得较大的距离。相反,如果所有数据样本都相同,则无论簇的数量如何,总是会得到零距离。

从文档中我可以预期所有值都是负数。如果您同时观察到负值和正值,那么得分可能会超过该值。

我想知道你是怎么想到聚集成两个星团的。

答案 1 :(得分:7)

ypnos是对的,你可以在这里找到一些细节: https://github.com/scikit-learn/scikit-learn/blob/51a765a/sklearn/cluster/k_means_.py#L893

inertia : float
    Sum of distances of samples to their closest cluster center.
"""

答案 2 :(得分:2)

文档中选择的单词有点混乱。 它说:“在K均值目标上,X值与相反。” 这意味着对K均值目标的否定。

K均值目标

K均值的目的是减少点到它们各自的聚类质心的距离的平方和。它具有其他名称,例如J平方误差函数,J分数或集群内平方和。该值表明群集的内部一致性。 (越少越好)

  

可以通过以下方法直接获得目标函数。

model.interia_