为啥当我用 K-means 进行 4 个聚类时,我只有一个惯性而不是 4 个?
Posted
技术标签:
【中文标题】为啥当我用 K-means 进行 4 个聚类时,我只有一个惯性而不是 4 个?【英文标题】:Why when I do 4 clusters clustering with K-means, I have only one intertia and not 4?为什么当我用 K-means 进行 4 个聚类时,我只有一个惯性而不是 4 个? 【发布时间】:2021-03-16 16:18:37 【问题描述】:我有一个数据框,我使用 sklearn KMeans 函数进行了 4 个集群聚类:
km = KMeans(n_clusters=4, init='random', n_init=10, max_iter=10,
tol=1e-4, random_state=10, algorithm='full', )
km.fit(df)
所以,我有 4 个集群,但是当我这样做时:
km.inertia_
我只得到一个值:
1732.350
但是根据惯性的定义,它是样本到它们最近的聚类中心的距离平方和。所以必须有 4 个惯性值而不是 1 还是我错了?
【问题讨论】:
它是一个标量inertia_ : float
scikit-learn.org/stable/modules/generated/…
注意,根据您的定义(强调我的):“sum 样本到 它们 最近聚类中心的距离平方”,所以如果您采用每个样本到它最近的聚类中心的平方距离,然后将它们全部相加,你会得到一个数字
@G.Anderson 所以你的意思是它是 4 个样本距离最近的聚类中心的总和?
@G.Anderson,我可以看到每个集群的不同距离吗?
1) 是的,完全正确。 2)您可以获得该信息,但您必须通过使用km.predict
预测每个样本所属的集群来手动计算它,然后计算从每个样本到分配它的集群中心的欧几里德距离(得到km.cluster_centers_
)
【参考方案1】:
属性interia
是一个数字,它是样本到最近的聚类中心的距离平方和。
【讨论】:
虽然这在技术上是正确的,但您刚刚重新发布了 OP 已经包含在他们的问题中的定义。对于一个好的答案,帮助消除对该定义具体含义的混淆是有意义的【参考方案2】:惯性被用作在多次运行中选择最佳聚类的标准。为了能够找到最好的,所有的聚类都应该以某种方式排序。这是通过为它们中的每一个分配一个称为惯性的单个标量值来完成的,这样它们就可以很容易地相互比较。此值不应以任何其他方式使用。
这是在矩阵密集的情况下计算其值的当前实现(源代码可用here):
cpdef floating _inertia_dense(
np.ndarray[floating, ndim=2, mode='c'] X, # IN
floating[::1] sample_weight, # IN
floating[:, ::1] centers, # IN
int[::1] labels): # IN
"""Compute inertia for dense input data
Sum of squared distance between each sample and its assigned center.
"""
cdef:
int n_samples = X.shape[0]
int n_features = X.shape[1]
int i, j
floating sq_dist = 0.0
floating inertia = 0.0
for i in range(n_samples):
j = labels[i]
sq_dist = _euclidean_dense_dense(&X[i, 0], ¢ers[j, 0],
n_features, True)
inertia += sq_dist * sample_weight[i]
return inertia
有一个循环,它遍历所有集群并累积总和,因此它没有提供单独获取每个集群的惯性值的方法。如果每个集群都需要惯性,那么你必须自己实现。
【讨论】:
以上是关于为啥当我用 K-means 进行 4 个聚类时,我只有一个惯性而不是 4 个?的主要内容,如果未能解决你的问题,请参考以下文章