如何使用 KMEANS 计算每个记录的聚类距离?

Posted

技术标签:

【中文标题】如何使用 KMEANS 计算每个记录的聚类距离?【英文标题】:How to compute cluster distance from each record using KMEANS? 【发布时间】:2019-05-25 08:25:29 【问题描述】:

我在包含两个集群的数据集上应用了 Kmeans 算法。我的数据集形状是 (506,13)。如何获取每条记录的聚类距离?

我尝试使用欧几里得距离作为聚类中心,但我想知道每条记录到两个聚类的距离。

model= KMeans(n_clusters=2)
model.fit(X)
print(model.cluster_centers_)

[3.88774444e-01 1.55826558e+01 8.42089431e+00 7.31707317e-02
5.11847425e-01 6.38800542e+00 6.06322493e+01 4.44127154e+00
4.45528455e+00 3.11926829e+02 1.78092141e+01 3.81042575e+02
1.04174526e+01]
[1.22261690e+01 3.01980663e-14 1.84518248e+01 5.83941606e-02
6.70102190e-01 6.00621168e+00 8.99678832e+01 2.05447007e+00
2.32700730e+01 6.67642336e+02 2.01963504e+01 2.91039051e+02
1.86745255e+01]

**actual results:**
from sklearn.metrics.pairwise import euclidean_distances
dists = euclidean_distances(model.cluster_centers_)
array([[  0.        , 369.34000546],
[369.34000546,   0.        ]])

**Expected results:**

rows cluster_1_distance  cluster_2_distance
 0        0.78                 0.89
 1        0.53                 0.66

【问题讨论】:

【参考方案1】:

使用 scipy.spatial.distance 库中的 cdist 函数。

如参考中所述,它需要 2 个矩阵,并返回两个矩阵中每对之间的距离。您可以使用metric 参数来指定您想要的距离函数的类型。

在你的情况下,

from scipy.spatial.distance import cdist
dists = cdist(X,model.cluster_centers_,metric='euclidean') #shape of dists : (506,2) 

【讨论】:

我已经尝试过你提到的 cdist 但它给出了一个错误,X = pd.DataFrame(np.random.rand(10,5),columns=['A','B','C','D','E']) model= KMeans(n_clusters=2) dists = cdist(f1,model.cluster_centers_,metric='euclidean') AttributeError: 'KMeans' object has no attribute 'cluster_centers_' @ShihabShahriar model = model.fit(X)model.fit(X) 是等价的。 是的.. 几分钟后我才意识到......无论如何,谢谢

以上是关于如何使用 KMEANS 计算每个记录的聚类距离?的主要内容,如果未能解决你的问题,请参考以下文章

聚类算法 - kmeans

关于k-means算法的聚类分析

聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用

浅谈聚类

KMeans 聚类后的聚类点(scikit learn)

一种接受任意距离函数的聚类算法