K-Means 聚类 - 计算多变量数据集中的欧几里得距离

机器算法验证 数据可视化 聚类 k-均值
2022-03-28 04:43:25

我刚刚完成了一个包含 2 个变量(X 和 Y)的简单练习,以了解 K-Means 聚类的工作原理。结果看起来像这样,

简单 K-Means 聚类结果

我的问题是,如果我有另一列 Z,应该如何绘制散点图以包含新变量 Z?是否需要 3 维散点图?

以及如何计算 X、Y 和 Z 坐标之间的欧几里得距离?

澄清一下,我不是在寻找像 R 或 Weka 这样的软件来解决问题,而是更多地了解细节和计算的工作原理。

3个回答

你在这里谈论两个不同的问题

  1. 我如何可视化 k-means 在 N>2 维中所做的事情
  2. 如何计算 N>2 维的 k-means

第二个比第一个更容易回答。

当您有 X、Y 和 Z 时,要计算欧几里得距离,您只需将平方和平方根相加即可。这适用于任意数量的维度

D=iXi2

第一部分,可视化,要困难得多,但也没有正确的答案——它只是一个工具,用于检查它是否在做你认为的事情,并了解正在发生的事情。如果 N 变得非常大,则没有简单的方法可以做到这一点。

对于三个维度,有几种常见的方法,各有优缺点:

  • 3D 图表:您可以像在现实世界中一样看待事物,但您确实需要能够旋转图像以感受深度
  • 点中的颜色:这是一个很好的方法,使用红色表示最低 Z 值,蓝色表示最高 Z 值,然后是两者之间的光谱。然后,K-Mean 中心将具有集群的“平均”颜色。

对于更高的维度,您必须求助于更近似的技术:

  • 切片/投影:删除一个或多个维度并将投影或切片到较低(即 2D)数量的维度上。这让您对正在发生的事情有所了解,但是您将需要很多它们来检查 K-Means 是否在中心(并且错误的切片/投影可能会完全错过有趣的结构)
  • 降维:现在开始真正努力工作(比 K-Means 本身复杂得多)。您可以尝试在每个集群本地或全局使用 PCA 之类的东西来查找“有趣”的平面,然后绘制它们。

特定于 K-Means,并且在 K 较低(例如 2)时特别有用,您可以在一对簇之间的投影上绘制距离上的点的密度。

例如,假设我们回到 2D 并有一个像这样的散点图:

KMeans 散点图

两个大斑点是 KMeans 中心,我添加了穿过这两个点的线。如果将每个点垂直投影到该线上,则可以查看每个中心周围的点分布,如下所示:

KMeans 点图

我在哪里用粗线标记了手段的位置。无论您使用多少维,都可以绘制第二张图,这是一种查看集群分离程度的方法。

不要计算欧几里得距离

K-means 最小化集群内方差,又名:WCSS。

http://en.wikipedia.org/wiki/K-means_clustering

那么你的问题应该很明显了。偏差平方和,所有维度的总和。

将 k-means 视为“最小化平方距离”是等效的,但具有误导性。问题是k-means 不能优化任意距离平均值与任意距离不兼容,但它是最小二乘估计(在每个单一维度中)。

所以首先不要使用欧几里得距离;使用 Within-Cluster-Sum-of-Squares (这也会更快,因为您不计算平方根)

一般来说,Kmeans 算法可以适用于任何维度,只要确保您在计算距离时考虑到所有 N 个特征。您仍然可以使用欧几里得距离作为相似性度量,看看 n 维方程http://en.wikipedia.org/wiki/Euclidean_distance

为了可视化结果,我建议使用主成分分析进行降维,最佳结果(准确性)来自在聚类后执行 PCA,因此您不会丢失任何信息,尽管您可以使用 PCA 将其预处理到较小的集合维度和聚类数据,该聚类将花费更少的时间来完成,因为它们在距离函数中处理的维度更少。此外,如果您计划对其进行预处理,则不会丢失太多信息,因为大部分信息都在第一个派生组件中。它们应该是 R 中的库以执行 PCA。https://stat.ethz.ch/R-manual/R-patched/library/stats/html/princomp.html