为什么当我用 K-means 做 4 个集群时,我只有一个惯性而不是 4 个?
Why when I do 4 clusters clustering with K-means, I have only one intertia and not 4?
我有一个数据框,我使用 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 还是我错了?
属性interia
是一个数字,它是样本到最近聚类中心的距离的平方和。
惯性被用作 select 几次运行中最佳聚类的标准。为了能够找到最好的一个,所有的聚类都应该以某种方式排序。这是通过为它们中的每一个分配一个称为惯性的标量值来完成的,这样它们就可以很容易地相互比较。此值不打算以任何其他方式使用。
这是在矩阵密集的情况下计算其值的当前实现(源代码可用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
只有一个循环,遍历所有集群并累加总和,因此它没有提供单独获取每个集群的惯性值的方法。如果每个集群都需要惯性,那就得自己实现了。
我有一个数据框,我使用 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 还是我错了?
属性interia
是一个数字,它是样本到最近聚类中心的距离的平方和。
惯性被用作 select 几次运行中最佳聚类的标准。为了能够找到最好的一个,所有的聚类都应该以某种方式排序。这是通过为它们中的每一个分配一个称为惯性的标量值来完成的,这样它们就可以很容易地相互比较。此值不打算以任何其他方式使用。
这是在矩阵密集的情况下计算其值的当前实现(源代码可用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
只有一个循环,遍历所有集群并累加总和,因此它没有提供单独获取每个集群的惯性值的方法。如果每个集群都需要惯性,那就得自己实现了。