在层次聚类中归一化欧几里德距离度量的原因

机器算法验证 聚类 正常化
2022-02-13 01:52:39

显然,在距离度量为欧几里得距离的层次聚类中,必须首先对数据进行归一化或标准化,以防止具有最高方差的协变量驱动聚类。为什么是这样?这不是可取的吗?

3个回答

这取决于您的数据。实际上它与层次聚类无关,而与距离函数本身有关。

问题是当你有混合属性时。

假设您有人员数据。重量(克)和鞋码。鞋子尺寸差异很小,而体重(以克为单位)的差异要大得多。你可以想出几十个例子。您只是无法比较 1 克和 1 鞋码的差异。事实上,在本例中,您计算​​的物理单位为gshoe-size

通常在这些情况下,欧几里得距离是没有意义的。但在许多情况下,如果您对数据进行规范化,它可能仍然有效。即使它实际上没有意义,但对于没有“被证明正确”的距离函数的情况,例如人类尺度物理世界中的欧几里德距离,它也是一个很好的启发式方法。

如果您不对数据进行标准化,那么以大值单位测量的变量将主导计算的差异,而以小值单位测量的变量将贡献很小。

我们可以通过以下方式在 R 中将其可视化:

set.seed(42)
dat <- data.frame(var1 = rnorm(100, mean = 100000),
                  var2 = runif(100),
                  var3 = runif(100))
dist1 <- dist(dat)
dist2 <- dist(dat[,1, drop = FALSE])

dist1包含基于所有三个变量的 100 个观测值的欧几里得距离,同时dist2包含仅基于的欧几里得距离var1

> summary(dist1)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
0.07351 0.77840 1.15200 1.36200 1.77000 5.30200 
> summary(dist2)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
0.000072 0.470000 0.963600 1.169000 1.663000 5.280000

请注意距离的分布有多相似,表明 和 的贡献很小var2var3并且实际距离非常相似:

> head(dist1)
[1] 1.9707186 1.0936524 0.8745579 1.2724471 1.6054603 0.1870085
> head(dist2)
[1] 1.9356566 1.0078300 0.7380958 0.9666901 1.4770830 0.1405636

如果我们将数据标准化

dist3 <- dist(scale(dat))
dist4 <- dist(scale(dat[,1, drop = FALSE]))

那么仅基于var1和基于所有三个变量的距离就会发生很大变化:

> summary(dist3)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
0.09761 1.62400 2.25000 2.28200 2.93600 5.33100 
> summary(dist4)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
0.000069 0.451400 0.925400 1.123000 1.597000 5.070000 
> head(dist3)
[1] 2.2636288 1.7272588 1.7791074 3.0129750 2.5821981 0.4434073
> head(dist4)
[1] 1.8587830 0.9678046 0.7087827 0.9282985 1.4184214 0.1349811

由于层次聚类使用这些距离,是否需要标准化将取决于您拥有的数据/变量的类型以及您是否希望大事物主导距离并因此主导聚类的形成。对此的答案是特定于领域和特定于数据集的。

Anony-Mousse 给出了很好的答案我只想补充一点,有意义的距离度量将取决于多元分布的形状。对于多元高斯,马氏距离是合适的度量。