计算pandas数据框中kmeans的损失函数

问题描述 投票:0回答:3

我有一个包含 5 列的数据框。我正在尝试对三个变量

X
Y
Z
的点进行聚类,并找到 kmeans 聚类的损失函数。下面的代码可以解决这个问题,但是如果我为带有
160,000
行的真实数据帧运行此代码,则需要永远!我认为这可以做得更快。

PS:似乎

KMeans
中的
sklearn
模块不提供损失函数,这就是我编写自己的代码的原因。

from sklearn.cluster import KMeans
import numpy as np

df = pd.DataFrame(np.random.randn(1000, 5), columns=list('XYZVW'))
kmeans = KMeans(n_clusters = 6, random_state = 0).fit(df[['X','Y', 'Z']].values)
df['Cluster'] = kmeans.labels_
loss = 0.0
for i in range(df.shape[0]):
    cluster = int(df.loc[i, "Cluster"])
    a = np.array(df.loc[i,['X','Y', 'Z']])
    b = kmeans.cluster_centers_[cluster]
    loss += np.linalg.norm(a-b)
print(loss)
python pandas join cluster-analysis k-means
3个回答
2
投票

看起来

scipy
包负责损失函数,而且速度相当快。这是代码:

from scipy.cluster.vq import vq, kmeans, whiten
import numpy as np
df = pd.DataFrame(np.random.randn(1000, 5), columns=list('XYZVW'))
centers, loss = kmeans(df[['X','Y', 'Z']].values, 6)
df['Cluster'] = vq(features, centers)[0]

话虽这么说,我仍然有兴趣知道使用

sklearn
kmeans
模块计算损失函数的最快方法。


2
投票

http://scikit-learn.org/stable/modules/ generated/sklearn.cluster.KMeans.html

惯性_:浮动

样本到最近聚类中心的距离总和。


0
投票

建议使用欧几里得范数是不正确的。

正如@Has QUIT--Anony-Mousse提到的,我们想要的是到最近质心的平方距离之和,也称为惯性。

这就是如何使用自定义矢量化代码计算intertia,匹配sklearn:

loss = (np.expand_dims(X,1)-kmeans.cluster_centers_)**2 # (N_BATCH,N_CLUSTERS,N_FEATURES)
loss = loss.sum(-1).min(-1) # minimize sum of squares 
loss = loss.sum() # aggregate over a data batch or dataset
loss
© www.soinside.com 2019 - 2024. All rights reserved.