如何计算 Sklearn 中点到质心的平均距离的平均值? [复制]

Posted

技术标签:

【中文标题】如何计算 Sklearn 中点到质心的平均距离的平均值? [复制]【英文标题】:How to calculate mean of average distance of points to centroids in Sklearn? [duplicate] 【发布时间】:2019-11-21 16:20:54 【问题描述】:

我被要求计算每个点到其质心的平均距离。已经提供了数据集和集群数量,这似乎是一个非常直接的问题(考虑到 k-means 集群的作用),但我似乎找不到可行的解决方案。

数据集是一个 3 列、500 行的带有浮点数的 Excel 工作表。

根据我的阅读,最简单的方法是将点到每个质心的距离放在一个 numpy 数组中并计算平均值。这就是我在下面所做的。

from sklearn.cluster import KMeans
import pandas as pd
import matplotlib.pyplot as plt
'exec(%matplotlib inline)'
import numpy as np

df = pd.read_excel('k-means_test.xlsx', sheet_name='data_set')
X = np.array(df)
plt.scatter(X[:,0],X[:,1], label = 'True Position')

kmeans = KMeans(n_clusters=5)
kmeans.fit(X)

## print(kmeans.cluster_centers_)

plt.scatter(X[:,0],X[:,1], c=kmeans.labels_, cmap='rainbow')
## plt.show()

distances = kmeans.fit_transform(X)
variance = 0
i = 0
for label in kmeans.labels_:
    variance = variance + distances[i][label]
    i = i + 1

mean_distance = np.mean(distances)
print(mean_distance)

我预期的值介于 1.41 和 2.85 之间,但我得到的是 11.3。很遥远。

任何帮助将不胜感激。一般来说,我对 python 和机器学习算法还是很陌生。

【问题讨论】:

看看:***.com/questions/40828929/… 感谢@MaximilianPeters,我尝试将其中一些代码合并到我上面的示例中,但事情失控了(这里的初学者和对我来说示例中的一些代码很复杂) - 所以我走下麻木的平均方法。我再看看能不能推导出什么。 【参考方案1】:

K-means 使用 平方 欧几里得距离。

人们经常错误地认为这意味着最小化欧几里得距离——事实并非如此。

无论如何,尝试插入distances = numpy.sqrt(distances),之后您的平均值可能会低于 3。

【讨论】:

嗨@Anony-Mousse,感谢您的评论-从概念上讲,每一个都有帮助。不幸的是,这导致了 3.37 - 所以我一定是在某个地方搞砸了。也许尝试使用欧几里得距离有问题? 嗯,你正在计算到所有三个中心的平均距离...... 嗯......不知道这应该如何影响我的答案仍然需要在 1.41 和 2.85 之间的点,因为所有点到它们各自中心的平均距离。并且有 5 个集群,而不是 3 个。您是否建议上面的代码计算所有点到所有 5 个中心的平均距离? 是的。每个点的所有中心。检查distances的形状。

以上是关于如何计算 Sklearn 中点到质心的平均距离的平均值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

sklearn KMeans聚类算法(总结)

机器学习K-Means

环形环绕地图上一组点之间的“质心”,可最大限度地减少到所有点的平均距离

k均值聚类

如何计算质心和数据矩阵之间的距离(用于 kmeans 算法)

如何在 DBSCAN sklearn 中获取质心?